D3DFVF淺談------ D3DFVF_XYZ 和 D3DFVF_XYZRHW 的區別
轉載自:http://hi.baidu.com/lovebirds/blog/item/33d450af4a2f19f3fbed509b.htmlD3DFVF淺談
有些新手不知道什么是D3DFVF ,這里做個簡單介紹,和一些應用。但關于D3DFVF 最官方的資料還是看SDK(但它是英文的)。
D3DFVF_XYZ——頂點的三維坐標,表示有位置,而且會又Direct3D進行矩陣變換;
D3DFVF_XYZRHW——即平時所說rhw,它說明頂點有位置,而且經過了矩陣變換,不用在由Direct3D對它進行變換,通常用于做UI(用戶界面);
D3DFVF_DIFFUSE——表示頂點格式中有漫反射顏色;
D3DFVF_NORMAL——表示頂點有法線向量;
D3DFVF_TEX^——表示頂點有紋理坐標,^可以是1至8,表示有多少套紋理坐標;
以上是最常用的D3DFVF了,如果還要更詳細,請看SDK(一半以上的夠用了)。
還有一些應用方法:
1、在創建VB時,pd3dDevice->CreateVertexBuffer(3*sizeof(Vertex),D3DUSAGE_WRITEONLE,FVF,D3DPOOL_MANAGED,&先前聲明的VB,NULL);
在此之前還要先定義FVF:
#define FVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)//這里隨自己需要
還要定義自己的頂點結構,這個FVF,頂點結構可以這樣:
struct Vertex
{
float x,y,z;//對應D3DFVF_XYZ
DWORD diffuse;//對應D3DFVF_DIFFUSE
};
2、我們很多時候要用到ID3DXMesh,但它的頂點用矩陣變換還不夠,不能滿足骨骼動畫的需求,所以只能用Vertex Shader和ID3DXMesh::LockVertexBuffer()了,這里重點說LockVertexBuffer()。
首先,我們不知到Mesh的格式,如果貿然用LockVertexBuffer()會出錯,所以先統一Mesh的頂點格式:
ID3DXMesh Mesh;
..........
Mesh->CloneMeshFVF (D3DXMESH_MANAGED,D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE|D3DXFVF_TEX1),pdev,&Mesh);
重新定義結構Vertex:
struct Vertex
{
float x,y,z;//對應D3DFVF_XYZ
float nx,ny,nz;//對應D3DFVF_NORMAL
DWORD diffuse;//對應D3DFVF_DIFFUSE
float u,v;//對應D3DFVF_TEX1
};
之后就可以Lock了:
Vertex *v;
int numV=Mesh->GetNumVertices();//Mesh的頂點數量
Mesh->LockVertexBuffer(NULL,(void**)&v);
for(int i=0;i<count;i++)
{
v[i].x+=5;//這里就是實現,可以任意把v[i]的數據調整
}
Mesh->UnlockVertexBuffer();//解Lock
http://bbs.gameres.com/showthread.asp?threadid=29618
D3DFVF_XYZ 和 D3DFVF_XYZRHW 的區別
學習D3D9的時候遇到靈活頂點格式(FVF)中D3DFVF_XYZRHW和D3DFVF_XYZ之間差異而引起的問題。
參看了同是C++博客的一篇博文,其分析如下:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
另外一個帖子: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
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的區別。