DirectX:动态顶点声明
DirectX: Dynamic Vertex Declartion
我正在编写一个需要适应各种潜在顶点格式的应用程序。 我正在加载的网格可能有也可能没有任意数量的潜在顶点属性(颜色、法线、纹理坐标、权重等)。
声明的简单示例如下所示:
D3DVERTEXELEMENT9 simple_decl[] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
{0, 20, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
{0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
D3DDECL_END()
};
struct MYVERTS
{
float x,y,z,u,v;
DWORD colr;
float nx,ny,nz;
};
基本上,D3DVERTEXELEMENT9是一个偏移量数组。 每个偏移量是"MYVERTS"的数据模因的大小。
如果用户导出仅具有 XYZ 坐标和颜色的模型,那么我想动态生成一个具有 3 个浮点数和 1 个 dword 的结构,然后生成一个带有偏移量和D3DDECLUSAGE的声明。
我不知道该怎么做。 有人有什么建议吗?
您将无法"动态生成结构",但您可以从填写自己的D3DVERTEXELEMENT9
数组开始。一种简单的方法是分析它正在使用的组件和类型的用户模型,并将其push_back()
到std::vector<D3DVERTEXELEMENT9>
中。
分析模型中的所有分量后,可以计算每个分量(示例中的第二列数字)的偏移量。您需要计算从最后一个组件到下一个组件开始的另一个"偏移量",这将成为您的顶点步幅。在您的示例中,它是 24,加上 D3DDECLTYPE_FLOAT3
或 12 的大小,顶点步幅为 36。
获得偏移量和步幅后,可以将用户模型中的顶点数据写入顶点缓冲区中的正确字节。
您甚至可以在推送D3DDECL_END()
后将vector
的内容传递给 D3D。
相关文章:
- 如何循环打印顶点结构
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 如何在DX9中获取顶点声明
- OpenGL 在顶点着色器中声明统一后不渲染
- DirectX:动态顶点声明
- 顶点声明不包括在 OGRE::VES_DEFFUSE
- 搅拌器波前对象:人脸声明中的顶点数大于所有顶点数