流水线:
1.应用阶段:(CPU)输出渲染图元,粗粒度剔除等 比如完全不在相机范围内的需要剔除,文件系统的粒子系统实现就用到粗粒度剔除。
2.几何阶段:(GPU)把顶点坐标转换到屏幕空间,包含了模型空间 到世界空间 到观察空间(相机视角view) 到齐次裁剪空间(投影project2维空间,四维矩阵,通过-w<x<w判断是否在裁剪空间)
到归一化设备坐标NDC(四维矩阵通过齐次除法,齐次坐标的w除以xyz实现归一化) 到屏幕空间(通过屏幕宽高和归一化坐标计算)。
a.顶点着色器:坐标变换和逐顶点光照,将顶点空间转换到齐次裁剪空间。
b.曲面细分着色器:可选
c.几何着色器:可选
d.裁剪:通过齐次裁剪坐标的-w<x<w判断不在视野范围内的部分或者全部裁剪,归一化。
e.屏幕映射:把NDC坐标转换为屏幕坐标
3.光栅化阶段:(GPU)把几何阶段传来的数据来产生屏幕上的像素,计算每个图元覆盖了哪些像素,计算他们的颜色、
a.三角形设置:计算网格的三角形表达式
b.三角形遍历:检查每个像素是否被网格覆盖,被覆盖就生成一个片元。
c.片元着色器:对片元进行渲染操作
d.逐片元操作:模板测试,深度测试 混合等
e.屏幕图像
-------------------------------------------------------
矩阵:
M*A=A*M的转置(M是矩阵,A是向量,该公式不适合矩阵与矩阵)
坐标转换:
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);顶点位置模型空间到齐次空间
o.worldNormal = mul((float3x3)_Object2World,v.normal);//游戏中正常的法向量转换,转换后法向量可能不与原切线垂直,但是不影响游戏显示,而且大部分显示也是差不多的。一般用这个就行了。
o.worldNormal = mul(v.normal, (float3x3)_World2Object);顶点法向量从模型空间转换到世界空间的精确算法,公式是用_Object2World该矩阵的逆转置矩阵去转换法线。然后通过换算得到该行。
-------------------------------------------------------