|
发表于 2012-5-15 22:47:00
|
显示全部楼层
Re:关于Direct3D几何流水线疑惑
纺织厂生产衣服,10几道工序,其中一道工序改变,相应的机器可能要做一下调整.
比如生产产品S和产品B件若干件.他们的机器设置肯定不一样.
你肯定是生产完S后,再生产B.这样所有设备只要一次设置一次就行了.
而不是一会生产S,一会生产B,那么效率就大大降低了,因为每次生产不同的产品,途中你都要对设备做调整.
显卡的固定管线也是一样的道理. 也分几道工序.工序中设备状态(显卡部件的设备状态),称之渲染状态.
只要你在处理数据时,不是频繁的切换渲染状态,即SetRenderState 乱用一气,效率就差不到哪去了.
所以渲染编程时,要尽可能地把渲染状态一致的物体组织在一起,然后按批渲染,象.x文件就是这样的,这绵id3dxmesh有个优化函数,就是为也把纹理相同的三角片面组织在一起(对显卡来说,递交给他的纹理不同,就会引发一次渲染状态改变),然后按批渲染. 另一方面,考虑如何不渲染...以后你自然会理解的.
----------------------
关于流水线,理解到这一点就差不多了.
固管,不是白叫的,它有一套默认的设备设置(渲染状态).所以程序员不指定什么也没关系.
比如视图转换,默认情况下,相机坐标系和世界坐标系,是重合的. 当你去自定义的话,只是因为你想一开始就从你想要的角度去看这个三角面,如果懒人一个,当然不用指定了.
因为考虑到例子中三角面的三个顶点位置, 相机是从Z正方向看那个三角面,已经可以达到预期的可视要求了.
为什么达到预期的可视要求?
透视矩阵,设width/height= 4/3.角度取得是90度.所以很快可得口算到这个大致的转换矩阵
1.33 0 0 0
0 1 0 0
0 0 1 1
0 0 -1 0
你把上面的三个点做矩阵转换,再规一.就得到三个点标:
(-0.65, 0)
( 0, 0.5)
(0.65, 0)
然后[-1,1]范围的这个二维平面画一下,就知道它会显示在屏幕的上半部分.
当然实际做法都是在世界坐标系下去考虑的,实际效果再慢慢调整相机位置,这时,你必然要亲自设置相机的位置及视线了.
|
|