3D数学: 背面剔除(Clipping)、裁切(Backface Culling)、光栅化(Rasterzation)
3D数学 学习笔记(10) 背面剔除(Clipping)、裁切(Backface Culling)、光栅化(Rasterzation)
参考书籍:
《3D数学基础:图形与游戏开发》
《Unity Shader 入门精要》
背面剔除(Backface Culling)
移除没有面对这镜头的三角形,只考虑三角形与摄像机的相对位置而不依赖与摄像机朝向。依靠三角形顶点顺序直接判断法向量方向(左手法则)。
顺时针法向量朝外,逆时针朝内,剔除。
下图圈中法向量方向虽然和镜头方向大致相同(小于180度),但实际上是看得到的。
裁切(Clipping)
把不在视锥体内或不完全在的三角形清除或剪切。输出裁切后的顶点。每条边分四种情况:
多边形裁剪:
光栅化(Rasterzation)
在裁切后,顶点会投影到屏幕坐标。概念性的有以下5个执行步骤:
- 插值(Interpolate),大部分计算如:顶点级别的纹理坐标、颜色、法线都要在着色前计算好。
- 深度测试(Depth test),剔除掉被遮住的像素。这里计算也可能是在着色后计算。
- 着色(Shader):为像素计算颜色。一般先光照后雾化,输出的颜色包含透明值,即RGBA。
- 透明测试(Alpha test),丢弃过度透明的物体。有透明的物体不需要写入深度缓冲。
- 写入(Write),通过深度和透明测试的像素,会更新帧缓存和深度缓冲。深度缓存用新值直接替换旧值。帧缓存没有开启混合,则可直接替换,否则需要用alpha值混合。
浅谈“光线追踪”与“光栅化”
光线追踪是新奇事物吗?其实它一直存在
说道光线追踪,我们要从它的亲兄弟“光栅化”说起。、
光栅化是将一个图元转变为一个二维图像的过程。二维图像上每个点都包含了颜色、深度和纹理数据。
当你需要在屏幕上显示出一个3D的立方体时,首先我们知道,立方体这个模型是由8个点,12条边,6个面组成,这个时候我们聪明的前辈在程序中去计算这些点在对应摄像机位置时应当处于平面坐标的什么位置,再通过点的连接关系构建出线,最后构建成面,在这些面的显示器上应当出现的位置涂上色,屏幕上就显示了这个3D立方体了,这就是最基础的光栅化。
- 光栅化:
将几何数据经过一系列变换后最终转换为像素,从而呈现在显示设备上的过程
- 光线跟踪
是计算机图形学的核心算法之一。在算法中,光线从光源被抛射出来,当他们经过物体表面的时候,对他们应用种种符合物理光学定律的变换。最终,光线进入虚拟的摄像机底片中,图片被生成出来。由于该算法是成像系统的完全模拟,所以可以模拟生成十分复杂的图片。