SetVertexDeclaration()和SetFVF()
这两个函数效果应该是一样的吧,我最近修改了一段代码,源代码是用的SetVertexDeclaration(),放到我这就是不过:
void BSPTree::Render()
{
SetupMatrices();
pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
// pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
for(int i = 0; i < m_facesNum; i++)
{
if(m_faces[i].type != 1) continue;
BSPFace *pFace = &m_faces[i];
// Set texture image.
pd3dDevice->SetTexture(0, Textures[pFace->texID]);
pd3dDevice->SetTexture(1, LightMaps[pFace->lightmapID]);
// Set up data stream.
pd3dDevice->SetVertexDeclaration(VertexDeclaration);
pd3dDevice->SetStreamSource(0, VertexBuffer, 0, sizeof(BSPVertex));
// Draw.
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, pFace->startVertexIndex,
pFace->totalVertices / 2);
}
}
走到pd3dDevice->DrawPrimitive那就断掉。。。
最后我改成SetFvF(),比着顶点结构体写造了一个灵活顶点格式宏定义:
struct BSPVertex
{
Point3D vertex;
TexCoord texCoord;
TexCoord lightmapCoord;
Point3D normal;
unsigned char color[4];
};
#define D3DFVF_BSPVERTEX (D3DFVF_XYZ|D3DFVF_TEX0|D3DFVF_TEX1|D3DFVF_NORMAL|D3DFVF_LASTBETA_D3DCOLOR)
但是纹理坐标又不对了,我改怎么办。。为什么在我那用SetVertexDeclaration()不行?前面的创建都照搬过来的。
[解决办法]
效果不一定一样。
比如,SetVertexDeclaration可以设定纹理坐标是2个浮点数或者3个浮点数或者4个浮点数,也可以设定法线是3个浮点数或者4个浮点数或者一个4字节整数,非常灵活,此外还有很多别的特性,都是FVF做不到的,所以两者不一定能直接转换。
[解决办法]
在创建设备的时候要使用 硬件处理方式,软件会出现一些问题。