|
|
有些新手不知道什么是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: ockVertexBuffer()了,这里重点说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.x+=5;//这里就是实现,可以任意把v的数据调整
}
Mesh->UnlockVertexBuffer();//解Lock
就这样了,推荐大家看看Kane的教程。
差点忘了,上面也许有错误,前指出,我的邮箱:hdm2968@163.com |
|