zoukankan      html  css  js  c++  java
  • D3d中的 RHW(转)

    RHW(Reciprocal-of-homogenous-w)

    RHW 坐标是告诉 D3D 顶点序列已经经过 3D 变换,不需要在由 D3D 进行世界变换

     

     学习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);

            否则没有渲染结果。

  • 相关阅读:
    线程池:第一章:线程池的底层原理
    实战:第一章:防止其他人通过用户的url访问用户私人数据
    java程序报错:Unable to open debugger port (127.0.0.1:63959): java.net.SocketException "socket closed",编译过来就是无法打开调试器端口,套接字已关闭
    面试:第十三章:中高级程序员面试
    队列:第一章:阻塞队列
    我的分享:第三章:SpringCould五大组件
    Linux系统:第十章:服务器环境搭建
    深入理解JUC:第六章:Semaphore信号灯
    编写高质量JS代码的68个有效方法(十三)
    前端构建之gulp与常用插件
  • 原文地址:https://www.cnblogs.com/waterdragon/p/2148768.html
Copyright © 2011-2022 走看看