RHW(Reciprocal of Homogeneous W[1])
英文原文意思:
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 clippingcalculations and should be set to 1.0.
中文翻译:
RHW值代表了某个顶点(x,y,z,w)的齐次点的W的倒数,它告诉Direct3D,顶点正在使用已经在屏幕坐标。 这个值通常用在雾和裁剪中
计算,应该设置为1.0。
什么是齐次坐标?
(1)从普通坐标转换成齐次坐标时
如果(x,y,z)是个点,则变为(x,y,z,1);
如果(x,y,z)是个向量,则变为(x,y,z,0)
(2)从齐次坐标转换成普通坐标时
如果是(x,y,z,1),则知道它是个点,变成(x,y,z);
如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)
这怎么理解呢?
1.在顶点结构体中不使用RHW时,D3D将执行视图、投影、世界等变换以及进行光线计算,之后你才能在窗口中得到你所绘制的物体。
用代码的语言描述:
D3DXMatrixLookAtLH 视图
D3DXMatrixPerspectiveFovLH 投影
LPDIRECT3DDEVICE9->SetTransform 世界
LPDIRECT3DDEVICE9->SetRenderState(D3DRS_LIGHTING,true); 光线,具体是不是执行光线计算是这种代码还待研究
2.当顶点结构体中使用RHW时,就像上面那段英文所述,告知Direct3D使用的顶点已经在屏幕坐标系中了,不再执行视图、投影、世界等变换和光线计算,
因为D3DFVF_XYZRHW标志告诉它顶点已经经过了这些处理,并直接将顶点进行光栅操作,任何用SetTransform进行的转换都对其无效。(说白了就是直接告诉D3D直接使用我给你的坐标绘制)
不过这时的原点就在客户区的左上角了,其中x向右为正,y向下为正,而z的意义已经变为z-buffer的象素深度。
D3DFVF_XYZRHW和D3DFVF_XYZ、D3DFVF_NORMAL不能同时使用。在使用
这种顶点时,系统需要顶点的位置已经经过变换了,也就是说x、y必须在屏幕坐标系中,
z必须是z-buffer中的象素深度,取值范围:0.0-1.0,离观察者最近的地方为0.0,观察范围内最远可见的地方为1.0。
(不过我测试的时候似乎z值不起作用。)
RHW值作用:
当相邻顶点的RHW值相同时,看不出差别。但是,使用戈劳德着色模式,相邻顶点的颜色差值将偏向RHW值高的一边,也就是说RHW高的一边在图元渲染的过程中占据较多的比重,该颜色看见的范围也大。如果某个点的RHW值为0,则直接使用另一个顶点的颜色值。