Graphics 克隆具有12个浮动中断的declration的ID3DXMesh?
我有以下顶点偏移:Graphics 克隆具有12个浮动中断的declration的ID3DXMesh?,graphics,3d,directx,id3dxmesh,Graphics,3d,Directx,Id3dxmesh,我有以下顶点偏移: struct MESHVERTInstanced { float x, y, z; // Position float nx, ny, nz; // Normal float tu, tv; // Texcoord float idx; // index of the vertex! float tanx, tany, tanz; // The tangent const sta
struct MESHVERTInstanced
{
float x, y, z; // Position
float nx, ny, nz; // Normal
float tu, tv; // Texcoord
float idx; // index of the vertex!
float tanx, tany, tanz; // The tangent
const static D3DVERTEXELEMENT9 Decl[6];
static IDirect3DVertexDeclaration9* meshvertinstdecl;
};
我宣布:
const D3DVERTEXELEMENT9 MESHVERTInstanced::Decl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
{ 0, 32, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 },
{ 0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0 },
D3DDECL_END()
};
我接下来要做的是使用新的顶点声明将ID3DXMesh复制到另一个ID3DXMesh中:
model->CloneMesh( model->GetOptions(), MESHVERTInstanced::Decl,
gd3dDevice, &pTempMesh );
当我尝试获取pTempMesh的FVF大小(d3dxgetfvvertexsize(pTempMesh->GetFVF())时,我得到了“0”,尽管大小应该是48
如果我没有最后一个声明,{0,36,D3DDECLTYPE_FLOAT3,d3ddecltmethod_DEFAULT,D3DDECLUSAGE_TANGENT,0}',并且CloneMesh函数不会返回失败,那么整个过程就可以了。我也尝试过使用不同的声明,比如D3DDECLUSAGE_TEXCOORD,效果很好,返回的大小为48。我不知道D3D的切线有什么特别的地方吗
我完全不知道为什么这不起作用…不是每个D3DVERTEXDECL都可以转换为FVF。在尝试获取FVF大小之前,应该三次检查是否有FVF兼容声明。尽管我无法理解您为什么要使用FVF,但它毫无用处,而且您也无法获得未来的技能,因为D3D10甚至不允许使用FVF。TBH正如DeadMG指出的那样,vertex decl与FVF不兼容。您询问是否有其他方法来获取顶点缓冲区的大小。显然,您知道缓冲区中有多少个顶点,并且在顶点声明中定义顶点结构时,您也知道顶点结构有多大(48字节)
const D3DVERTEXELEMENT9 MESHVERTInstanced::Decl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, //Starts at offset 0 and is 3 floats, or 12 bytes in size. Total = 12 bytes.
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, //Starts at offset 12 and is 3 floats, or 12 bytes in size. Total = 24 bytes.
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, //Starts at offset 24 and is 2 floats, or 8 bytes in size. Total = 32 bytes.
{ 0, 32, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 }, //Starts at offset 32 and is 1 float, or 4 bytes in size. Total = 36 bytes.
{ 0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0 }, //Starts at offset 36 and is 3 floats, or 12 bytes in size. Total = 48 bytes.
D3DDECL_END()
};
如果没有,请直接使用。还有其他方法可以获得顶点缓冲区的大小,以便我可以解析它吗?还有什么可以替代FVF?着色器和可编程管道。我建议您使用DirectX 9.0c,这是Frank Luna的一种着色器方法,它非常优秀并且是最新的。也有D3D10口味的,不过我相信D3D11还没有推出。编辑:不确定解析顶点缓冲区要做什么。。顶点缓冲区的大小是sizeof(您在OP中发布的结构)*您为创建它而输入的长度。您根本不应该手动处理顶点缓冲区-这就是ID3DXMesh存在的目的。啊,是的,这很有帮助,ID3DXMesh::GetNumbyteServerTex()似乎也可以工作。我并不知道顶点声明有多大,但我想知道,在我不知道顶点声明的大小的情况下,如何自动获得大小。