0

我正在尝试将顶点数据交错到标准向量模板的 STL 容器中。我已经使用 OpenGL 成功完成了这项工作,我的网格接口的源代码可在线获取我的开源项目... https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL/Graphics_Systems /OpenGL3/GL3model.cpp

现在我想使用 DirectX 执行相同的方法,并且已经通过逻辑异或我的 FVF DWORD 以及我拥有的每个顶点的组件来部分地做到这一点。然而,当它只包含顶点和法线时,这是网格当前呈现的内容:

在此处输入图像描述

现在 DX 让我在 OGL 中做同样的事情变得非常困难,我已经检查、仔细检查和一遍又一遍地检查,我的字节对齐在缓冲区内是完美的。OpenGL Wiki 可以更好地解释我正在尝试做的事情... /wiki/Vertex_Specification_Best_Practices#Formatting_VBO_Data

现在我也不想实现一个着色器来完成这个。如果有人可以简单地向我提供有关我正在尝试做什么的任何指示,或者指出我在 Direct3D 9 中执行此操作的示例或教程的方向,那真的会帮助我,因为这在 DX 中似乎不是很常见的做法.

4

1 回答 1

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% 的时间内使用浮点颜色。他们只是浪费存储和内存带宽。

于 2013-08-30T21:14:35.187 回答