D3DFVF_XYZRHW  

2011-06-27 01:57:31|  分类: Directx |  标签:d3dfvf_x  |字号 订阅

 
 

同样的程序,用D3DFVF_XYZ格式完全没问题,改成XYZRHW就渲染不出来,实在不知道该怎么样调试D3D程序了,在codesampler上找到一个例子看,RHW跟XYZ的坐标以及比例有点不一样。。。XYZ的话,原点在屏幕中心,然后最大为1.0,RHW原点在屏幕左上角,比例跟窗口设备像素相同(比如BackBuffer为800*600分辨率那么屏幕右下角坐标就是800,600),看来似乎还是DX文档阅读不够仔细啊。。。
       还有很重要的一点,在RHW中,z表示的类似于z-buffer,就是深度,范围是0~1(超过1的似乎按1算?还未具体测试),0最顶,最表面,1则是最底最靠后。UI系统可以考虑用RHW格式画,省去了投影还有什么其他矩阵变换的麻烦。。。
       还发现的一个比较重要的地方,若使用了LPDIRECT3DVERTEXBUFFER9但是最后程序退出的时候未进行Release()的话,VS会提示一大堆
Direct3D9: (ERROR) :    [0] : Address 00DCD4CB
Direct3D9: (ERROR) :    [1] : Address 00DCD59B
Direct3D9: (ERROR) :    [2] : Address 00DCD440
Direct3D9: (ERROR) :    [3] : Address 00DC1D44
Direct3D9: (ERROR) :    [4] : Address 4B66AF2E
Direct3D9: (ERROR) :    [5] : Address 0041EA4A
Direct3D9: (ERROR) :    [6] : Address 0041E5F1
Direct3D9: (ERROR) :    [7] : Address 0041B785
Direct3D9: (ERROR) :    [8] : Address 0041B475

 

在顶点结构体中没有RHW时,Direct3D将执行视、投影、世界等变换以及进行光线计算,之后你才能在窗口中得到你所绘制的物体。当顶点结构体中有RHW时,告知Direct3D使用的顶点已经在屏幕坐标系中了,不再执行视图、投影、世界等变换和光线计算,因为D3DFVF_XYZRHW标志告诉它顶点已经经过了这些处理,并直接将顶点进行光栅操作,任何用SetTransform进行的转换都对其无效。不过这时的原点就在客户区的左上角了,其中x向右为正,y向下为正,而z的意义已经变为z-buffer的象素深度。

 

    值得注意的是,D3DFVF_XYZRHW和D3DFVF_XYZ、D3DFVF_NORMAL不能共存,因为后两个标志与前一个矛盾。在使用这种顶点时,系统需要顶点的位置已经经过变换了,也就是说x、y必须在屏幕坐标系中,z必须是z-buffer中的象素深度,取值范围:0.0-1.0,离观察者最近的地方为0.0,观察范围内最远可见的地方为1.0。

/************************************************************************************************************************/

D3DFVF_XYZ和D3DFVF_XYZRHW的区别是:

1.D3DXYZ默认的坐标系统用户区中心是 (0,0) 而rhw的左上角是 (0,0).

2.D3DXYZ默认的非光照的,而RHW默认就是高洛夫的光照模式。