D3D中D3DFVF_XYZ和D3DFVF_XYZRHW的区别

转载 2012年03月21日 06:00:44

转自: http://www.cppblog.com/eros/archive/2008/07/14/56128.html

 

   学习D3D9的时候遇到灵活顶点格式(FVF)中D3DFVF_XYZRHW和D3DFVF_XYZ之间差异而引起的问题。
参看了同是C++博客的一篇博文,其分析如下:
       The RHW value, which stands for Reciprocal of Homogeneous W[1], tells Direct3D that the vertices that are being used are already in screen coordinates. This value is normally used in fog and clipping calculations and should be set to 1.0.
       在顶点结构体中没有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.0f1.33333f1.0f1000.0f);
      g_pd3dDevice
->SetTransform(D3DTS_PROJECTION, &matProj);

     
// Create and set the view matrix
      D3DXMatrixLookAtLH(&matView,                                \
        
&D3DXVECTOR3(0.0f0.0f-500.0f),       \
        
&D3DXVECTOR3(0.0f0.0f0.0f),          \
        
&D3DXVECTOR3(0.0f1.0f0.0f));
      g_pd3dDevice
->SetTransform(D3DTS_VIEW, &matView);
        否则没有渲染结果。

D3D中D3DFVF_XYZ和D3DFVF_XYZRHW的区别

 学习D3D9的时候遇到灵活顶点格式(FVF)中D3DFVF_XYZRHW和D3DFVF_XYZ之间差异而引起的问题。参看了同是C++博客的一篇博文,其分析如下:        The RHW val...

[D3D9] D3DFVF_XYZ、D3DFVF_XYZRHW 的区别 (以纹理渲染的代码举例说明)

POSITION (D3DFVF_XYZ) 使用世界坐标系,其方向与左手坐标系一致:X轴向右递增,Y轴向上递增,Z轴向屏幕内侧递增。 xyz各个轴的范围都是[-1,1] 中心点(0,0) 左上(-1...

D3D-lines(+D3DFVF_XYZ和D3DFVF_XYZRHW的区别)

#included3d9.h> #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #define WINDOW_...

D3DFVF_XYZ和D3DFVF_XYZRHW的区别

D3DFVF_XYZ和D3DFVF_XYZRHW有什么区别?以前好像没有仔细思考过,只是见到Beginning DirectX9中如是说:The RHW value, which stands for...

D3DFVF_XYZ D3DFVF_XYZRHW区别(转)

  有些新手不知道什么是D3DFVF ,这里做个简单介绍,和一些应用。但关于D3DFVF 最官方的资料还是看SDK(但它是英文的)。    D3DFVF_XYZ——顶点的三维坐标,表示有位置,而且会又...
  • cityice
  • cityice
  • 2011年02月25日 12:12
  • 835

DirecX学习一:重新认识D3DFVF_XYZRHW、D3DPT_POINTLIST、D3DPT_LINELIST

D3DFVF_XYZRHW: 之前都没有深入了解D3DFVF_XYZRHW,昨天开始认真做了下实验,D3DFVF_XYZRHW小小参数,包含了挺多东西的: DirectX and XNA解释: ...

Unity3d vector3.forward和transform.forward的区别!

在unity3d中有2个forward,一个是vector3.forward和transform.forward,这两个forward其实完全不一样。他们之间的区别主要体现在在不同坐标系时的反映上。 ...

Smart3D之手动配置 S3C 索引加载全部的OSGB瓦片数据

一、须知: S3C是Smart3D内部格式,实质上是一个分块模型的索引,可以将所有区块同时显示在一张图中; OSGB是国际通用三维场景格式,按区块存储,但是没有索引,因此每次只能显示一块。 因而配置O...

3DS导出到Unity3D的注意事项

使用3Dsmax2010进行制作,输出FBX的类型导入Unity3D中。默认情况下,3Dsmax8可以和Unity3D软件直接融合,自动转换为FBX物体。 1.面数控制 在MAX软件中制作...

css3+javascript实现3D游戏:二阶魔方

嗯,之前用css3和javascript实现3D旋转立方体的时候就说过了,要用qi
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:D3D中D3DFVF_XYZ和D3DFVF_XYZRHW的区别
举报原因:
原因补充:

(最多只允许输入30个字)