Direct3D 9.0交错非fvf顶点缓冲区

时间:2013-08-30 18:51:02

标签: c++ directx directx-9

我试图将顶点数据交错到std矢量模板的STL容器中。我已经用OpenGL成功完成了这个,我的网状界面的源代码可以在线获取我的开源项目...... https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL/Graphics_Systems/OpenGL3/GL3model.cpp

现在我想使用DirectX执行相同的方法,并且已经设法通过逻辑xor'ing我的FVF DWORD以及我拥有的每个顶点的组件来实现。然而,当网格仅包含顶点和法线时,这就是网格当前渲染的内容...... http://oi42.tinypic.com/2diq2dw.jpg

现在DX让我很难做到我在OGL中做的事情,我已经检查,双重检查,并反复检查,我的字节对齐在缓冲区内是完美的。 OpenGL Wiki可以更好地解释我想要做的事情...... /维基/ Vertex_Specification_Best_Practices#Formatting_VBO_Data

现在我不想实现着色器来实现这一点。如果有人可以简单地向我提供我想要做的任何指示或指向我在Direct3D 9中执行此操作的示例或教程的方向,它将真正帮助我,因为这似乎不是DX中非常常见的做法

1 个答案:

答案 0 :(得分:2)

仔细检查一下你要在这里做什么之后,我相信这就是你想要的:

D3DVERTEXELEMENT9 custom_vertex [] =
{
  { 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_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,    0 },
  D3DDECL_END()
};

此数据结构的格式与OpenGL的顶点指针系统非常相似,您必须传递偏移量,组件的大小和数量(例如D3DDECLTYPE_FLOAT3)。您还包括该字段的用途(例如D3DDECLUSAGE_COLOR)。与OpenGL不同,D3D可以通过使用D3DDECL_END()宏来为您计算步幅。

IDirect3DVertexDeclaration9* vertex_declaration;
d3dDevice->CreateVertexDeclaration (custom_vertex, &vertex_declaration);

现在你应该使用这个声明创建并填充你的顶点缓冲区。您可以根据需要使用不同的D3DVERTEXELEMENT9数组添加/删除元素。

请记住使用DWORD(D3D)或4 ubyte(OpenGL)颜色。没有理由在90%的时间内使用浮点颜色。它们只会浪费存储和内存带宽。