D3DFVF_XYZ 和 D3DFVF_XYZRHW 的区别

转帖:http://www.cppblog.com/eros/archive/2008/07/14/56128.aspx

学习D3D9的时候遇到灵活顶点格式(FVF)中D3DFVF_XYZRHW和D3DFVF_XYZ之间差异而引起的问题。
参看了同是 C++博客的一篇博文,其分析如下:
在顶点结构体中没有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默认的用户区中心坐标是(0,0),而 D3DFVF_XYZRHW是左上角为(0,0)
用D3DFVF_XYZ默认的为非光照的,而D3DFVF_XYZRHW是高洛德光照。
当使用D3DFVF_XYZ时,要设置渲染状态:

g_pd3dDevice -> SetRenderState(D3DRS_LIGHTING,FALSE)

而且要设置观察矩阵和投影矩阵,例如:

D3DXMATRIX matProj;
D3DXMATRIX matView;

// Create and set the projection matrix

D3DXMatrixPerspectiveFovLH( & matProj, D3DX_PI / 4.0f , 1.33333f , 1.0f , 1000.0f );
g_pd3dDevice -> SetTransform(D3DTS_PROJECTION, &
matProj);

// Create and set the view matrix

D3DXMatrixLookAtLH( & matView, /
& D3DXVECTOR3( 0.0f , 0.0f , - 500.0f
), /
& D3DXVECTOR3( 0.0f , 0.0f , 0.0f
), /
& D3DXVECTOR3( 0.0f , 1.0f , 0.0f
));
g_pd3dDevice -> SetTransform(D3DTS_VIEW, & matView);

否则没有渲染结果。

另外一个帖子:http://bbs.gameres.com/showthread.asp?threadid=121111

Re:D3DFVF_XYZRHW 中的W跟Z分别表示什么

D3DFVF_XYZRHW 的格式是(x,y,z,1/w),RHW是指W的倒数。

使用这个格式的顶点是不通过顶点变换的,也就是直接对应窗口设备坐标系,这个坐标系下Z的范围是[0,1]

(x,y,z)的形式是仿射坐标,(x,y,z,w)的形式是齐次坐标,详细的可以去看数学参考书。在这里由于已经是设备坐标系了,所以一般情况下 w只用1.0。但如果是自己做的三维空间变换得到的坐标,那么w就很重要,因为它要用于纹理的透视矫正。

最后一个帖子:http://hi.baidu.com/microsoftxiao/blog/item/4108ce58fab4ed87800a18f8.html

D3DFVF_XYZ D3DFVF_XYZRHW区别
2008-08-31 20:32

D3DFVF_XYZ - 顶点格式包括未变换的顶点位置。这个标记不能和D3DFVF_XYZRHW一起使用。
D3DFVF_XYZRHW - 顶点格式包括变换后的顶点位置。这个标记不能和D3DFVF_XYZ或D3DFVF_NORMAL
一起使用。
[注意] 使用D3DFVF_XYZRHW时,RHW分量应设置为>=1.0f,只有这样才表明该顶点为变换后的。

一定要了解DirectX SDK里DX90SDK/Samples/C++/Direct3D/Tutorials/Tut02_Vertices下的例子,
了解到 D3DFVF_XYZ D3DFVF_XYZRHW的区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值