GAMES101 10-12 笔记 几何
Texture的应用(上节课残余)
环境光照信息
- Spherical Environment Map。因为环境光照在金属圆球上可以反射显示出整个环境的现象,产生了球形环境地图 ,它的问题是会导致扭曲。
- Cube Map。球都可以放在立方体中,所以用该立方体的六个面来展示环境纹理,但计算量会变大。
Bump Mapping 凹凸贴图
纹理还有其他作用,比如影响shading,例子就是凹凸贴图:
纹理贴图不用来表示颜色,而用来表示凹凸情况(高度和法向量)
这种情况下,三角形数量不变,但对各个三角形的法线进行扰动,纹理定义了每个点相对高度的移动,以及其与相邻点的高度差,从而改变了法线。
具体法线怎么计算:
2维平面上:
其中c是系数用来缩放,表示这个凹凸贴图对结果的影响大不大
导数用差值计算从而得到切线
法线与切线垂直,所以直接x,y互换并取一项为负
3D空间里:
与平面同理
值得注意的是,上述都基于初始法线垂直平面的假设,实际上不可能满足,所以设置一个TSN(对应xyz)矩阵形成一个局部坐标系,使得在局部空间内法线是垂直于平面的。然后再把算出来的法线方向(凹凸后)重新计算回世界坐标内。
Displacement Mapping 位移贴图
Bump mapping在边缘上是会露馅,比如球仍然看起来是个圆
Displacement Mapping和Bump mapping用一样的贴图,但真的移动了表面上的顶点!
代价是需要模型足够细化三角形
纹理还可以用在其他地方,比如利用噪声创造纹理、用来保存光照信息(Provided Precomputed Shading)以及三维信息。
几何
介绍
隐式表达:一个函数方程的形式,代入各值可根据是否等于0或相等来判断在该几何表面或内外,比如:
显示表达:所有的点直接给出或用参数来表示/映射,比如:
依照具体情况选择隐式还是显示。
隐式表达
隐式的应用包括几何表面、构造实体几何、距离函数等
Distance Functions
把两个表面分开或融合时往往用到距离函数,比如融合:先算出两个物体的距离函数,然后将它们blending在一起,然后再恢复成原来的物体即可。具体例子如下:
比如图1有东西某刻挡住了1/3,图2挡住2/3,若想获取挡住1/2时的中间状态简单的融合是不行的,不能表示出整个运动过程。
正确做法是:
- 求出两个图的距离函数SDF(S是方向,有正负)(任何一个点到这个边界的距离)
- 融合两个图(两者加起来)则正好中间是0,从而blend了边界。
还有其他应用。
显示表达
主要集中在三角形表面、Bezier曲面、下分曲面、NURBS、点云等。
值得一提的是.obj文件
依次分别记录了顶点信息(8个),纹理坐标、法线信息(应该6个,但因数据偏差会有重复)以及最终平面信息,一行一个三角形(每行三块,每块代表一个点,其中三个值是顶点、纹理坐标和法线)
Curves 曲线
着重讲解 Bezier Curves 贝塞尔曲线
以上图的方式通过令t从0到1得到整个曲线。
具体代数公式计算上,找规律可得:
n代表共几次递归,即取到第几轮时只剩一个点
B是关于t的多项式,其实就是 (t + 1 - t)n 的展开,所以同一轮的各个B加起来为1
从而只需要输入控制点坐标b,就可得到曲线
贝塞尔曲线的重要性质:
如果是4个控制点(cubic Bezier):
该性质被用在处理曲线光滑问题:
两个曲线连接若光滑,则它们在该点的切线应该方向相反大小相同,所以经常把整个曲线按照4个控制点一组进行分组,从而可以轻松算出上一组最后一个点的切线和下一组第一个点的切线从而使其光滑。
另外,还有样条、B样条以及NURBS等,不介绍。其中NURBS可以依据给出的控制点直接给出光滑曲线。
Surfaces 曲面
曲面由曲线构成,所以同样可以用贝塞尔法则,只是做两次:
实际算法如下:
网格操作
- Mesh subdivision(upsampling) 上采样增加分辨率
- Mesh simplification(downsampling) 下采样来简化
- Mesh regularization 使每个三角形更规格化、整体质量更好
Subdivision
Loop Subdivision
只针对三角形
分两步:
- 创造更多三角形(顶点)
- 调整它们的位置
具体来说,对于新顶点,其到邻接的亮点距离更近,受影响更大,所以公式如下:
对于旧顶点,同理可得:
度越大代表受影响的点越多,从而自己本身原本的坐标越不重要。
Catmull-Clark Subdivision(General Mesh)
针对一般情况,操作如下:
Non-quad face是非四边形面
第一次下分后结果如下:
此时已经没有非四边形面,也就不会再产生新的奇异点(只有第一次特殊)
具体代数算法上如下:
Simplification
三角形数量越大越清晰越细节、越少越模糊成本越低,不同情况有不同需要。
Edge collapsing(Quadric Error Metrics 二次误差度量)
直接取平均不行,正确方法是这个新的顶点应该到各个面的距离的平方和最小
所以理论上应该选择对整个表面上的顶点依据二次误差度量排序来依次坍塌,但实际上第一个坍塌之后其他的会受它的影响,所以实际处理应该是要找一个数据结构使得能找到优先的一个点,然后用较小的代价去更新它所影响的其它点,所以需要用优先队列或者说堆来处理。优先队列相关,这个讲的蛮清楚的
实际上这样也不是完美(因为是从局部改),但没办法了。
Shadow Mapping
处理影子的问题步骤是:
- 先从光源看,更新深度缓冲
- 从视点看,对每个点回溯它到光源的距离,如果等于缓冲记录的距离,则可见无影子,不然就被遮挡有影子
问题是: - 精度不行,因为浮点数很难完全相等,所以有些没被遮挡的可能也算出来不一致,即使加一些范围bias也无法根除。
- 只能处理点光源,属于硬阴影,要么在阴影内,要么在阴影外
软阴影和硬阴影的对比: