赞
踩
本文主要参考的博客是:
csdn_chai —— 图形学复习要点
我想通过这篇文章,对图形学在游戏开发工程师面试时常考(可能会考)的问题,主要想有个提纲的认识。虽然图形学在面试中的比重比较小,但是还是要复习一下的。
图形学的考点主要分为三部分,一是渲染管线,二是数学尤其是线性代数和三维几何。
我们在图形学中,一般会有五个坐标系,分别是:
其中前四个矩阵之间,主要通过**model, view, projection矩阵进行相关的变换, 裁剪空间到屏幕空间通过视口变换进行;前三个是三维空间,后面两个是二维空间。
其转换过程如图1.1所示:
需要注意这三个矩阵在顶点着色器当中的作用:
视口变换发生在投影到2D屏幕后,将投影之后归一化的点映射到屏幕上指定的一块区域。在OpenGL中,是利用glViewPort函数来进行指定的。
这里有一张更加形象的图:
其中, gl_Position在从顶点着色器输出了之后,会用OpenGL自己的函数进行归一化和视口变换,其具体过程如下:
而片段处理程序的input是顶点处理程序的output经过了插值之后得到的值
光栅(栅格化或者像素化)化负责的是整个渲染过程中的几何成像的环节,把几何图元(点,线,面)投影到成像平面并确定哪些像素或采样点被图元覆盖。举例来说:
通用公式:
C o l o r = S r c ∗ S r c F a c t o r + D s t ∗ D s t F a c t o r Color = Src * SrcFactor + Dst * DstFactor Color=Src∗SrcFactor+Dst∗DstFactor
其中 C o l o r Color Color是混合结果, S r c Src Src是源颜色向量也就是纹理本来的颜色, D s t Dst Dst是目标颜色向量也就是储存在颜色缓冲中当前位置的颜色向量, S r c F a c t o r SrcFactor SrcFactor 和 D s t F a c t o r DstFactor DstFactor 分别是源因子和目标因子。先进入颜色缓冲区的是目标颜色, 比如在红色方块上绘制绿色方块,则红色是 D s t Dst Dst, 绿色是 S r c Src Src。 不同的factor导致了不同的混合方式:
注意,颜色常数向量可以用glBlendColor函数分开来设置。 OpenGL使用 void glBlendFunc(GLenum sfactor, GLenum dfactor)设置相关的混合方式,接受两个参数,来设置源(source) 和目标 (destination) 因子。OpenGL 为我们定义了很多选项,我们把最常用的列在下面了。注意,颜色常数向量[Math Processing Error]C_constant 可以用glBlendColor 函数来分开设置。在使用alpha 混合之前需要开启 glEnable(GL_BLEND);
最常用的混合方式就是: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
颜色向量(归一化的)有两种计算:
光照要处理的就是光颜色向量和物体颜色向量的点积。三种光照可以组合使用(*ambient + diffuse + specular * * objectColor)。
1. $\theta$越大, 光对片段颜色的影响越小, 反过来光线越靠近法线, 对物体颜色的影响越大。
2. $float diff = max(dot(norm, lightDir),0.0)$; 两个向量之间的角度越大,散射因子就会越小。
1. 通过反射法向量周围光的方向计算反射向量。 然后我们计算反射向量和视线方向的角度,如果之间的角度越小,那么镜面广德作用就会越大。 它的作用效果就是,当我们去看光被物体所反射的那个方向的时候,我们就会看到一个高光。
四元数介绍参考博客
四元数本质上是一种高阶复数(听不懂了吧。。。),是一个四维空间,相对于复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即
x
=
a
+
b
i
x = a + bi
x=a+bi,
i
i
i是虚数单位,如果你还记得的话应该知道
i
2
=
−
1
i^2 = -1
i2=−1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,
i
、
j
、
k
i、j、k
i、j、k,即一个四元数可以表示为
x
=
a
+
b
i
+
c
j
+
d
k
x = a + bi + cj + dk
x=a+bi+cj+dk。那么,它和旋转为什么会有关系呢?
在Unity里,tranform组件有一个变量名为rotation,它的类型就是四元数。很多初学者会直接取rotation的
x
、
y
、
z
x、y、z
x、y、z,认为它们分别对应了Transform面板里R的各个分量。当然很快我们就会发现这是完全不对的。实际上,四元数的
x
、
y
、
z
x、y、z
x、y、z和
R
R
R的那三个值从直观上来讲没什么关系,当然会存在一个表达式可以转换。
为了加快渲染速度和减少图像锯齿, 贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap
多级渐进纹理由一组分辨率逐渐降低的纹理序列组成,每一级纹理宽度和高度都是上一级纹理宽度和高度的一半。宽和高不一定相等,也就是说,这些纹理不一定都是正方形。
优点:提高渲染速度,减少图像锯齿
缺点:会增加额外的内存消耗。
平面上N个点,每两个点都确定一条直线,
求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。
平面上N个点,每两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。
关于这道题,网上已经给出了解答要点:
3个点A,B,C,把它们的按x坐标排序。假设排序后的顺序是ABC,那么有两种情况:
1. ABC共线,则$k(AB)=k(BC)=k(AC)$
2. ABC不共线,则ABC将形成一个三角形,那么$k(AC)<max(k(AB), k(BC))$
其中k是斜率。
程序的基本步骤是:
1. 把N个点按x坐标排序
2. 遍历,求相邻的两个点的斜率,找最大值
时间复杂度
N
l
o
n
g
(
N
)
Nlong(N)
Nlong(N)
先把这些点按x坐标从小到大排序,斜率最大的两点必然是挨一起的两个点,所以排序
O
(
n
∗
l
g
n
)
O(n* lg n)
O(n∗lgn),遍历一次
O
(
n
)
O(n)
O(n)就够了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。