顶点处理过程:
(注:图片取自书Microsoft Directx9 Programmable Graphics PipeLine。Microsoft 版权所有。
这里引用仅为学习使用。)
1。world transform.这是第一步,把物体放进3D坐标空间里来,才能进行下一步的
转换和处理。
2。Vertex blending. 这一步必须在view transform 之前完成,在view transform 之后完成的话依照我现在的理解可能会加深复杂度。顶点混合主要处理动画过程中分裂的现象(目前理解)。
发现顶点混合是在fixed pipeline中执行的,可见若使用vertex shader programmable pipeline不能使用顶点混合。?
3。view transofrm。进行视空间坐标转换。
4。vertex fog。顶点雾化。因为雾化是根据顶点距离视点的距离决定雾化的量化值的。因此必须在projection transform之前完成,因为在这之后,顶点已经全部变换到观察平面上了,不再有相互之间的距离(z值了)。
5。Lighting and Materials。光照和材质处理。这里形成颜色值。可能fog和光照材质处理顺序可以互换吧我想。这里也必须在projection transform之前完成。这有赖于空间位置。
6。projection transform. 转换顶点坐标到视口坐标。应该已经是二维坐标。z值应该为0。只是不知道z缓冲值怎么、何时写入。
这说明若要进行vertex blending。那么必须把世界变换矩阵和veiw transform矩阵分开传输进vertex shader.若无vertex blending,则可以把二个矩阵合并之后传输进vertex shader。
但是一般光照和材质是需要的。因此projection transform 可能单独传递。
(p:错误。刚才看例子:传递了两个矩阵,一个是world view 合并后的矩阵。
一个是world view projection三个矩阵合并后的矩阵。也是进行两次计算。)。
vertex position 的结果是用原始顶点值直接乘以world view projection合并后的矩阵直接输出。(
雾化和光照材质用的中间值用原始值乘以world view 合并后的矩阵。因为雾化和光照材质只影响颜色值。
所以中间值以后直接丢弃。怀疑这样可能有利于缩小误差?但这样多做了一次矩阵乘法(生成三个矩阵合并矩阵的乘法运算)。)