【问题标题】:C++ directx 11 how to interleave unknown number of vertex attributesC++ directx 11如何交错未知数量的顶点属性
【发布时间】:2020-11-18 03:52:54
【问题描述】:

我读过很多文章说通过将数据放入结构中来交错顶点属性

struct Vertex
{
  XMFLOAT2A vertex;
  XMFLOAT3A color;
  .
  .
  .
 }

这适用于教程,但适用于从 obj、colladae 文件等加载的真实世界模型。不可能预先知道网格包含多少属性,并且您无法编写包含所有可能属性组合的所有可能结构.

唯一的解决方案是先读取所有属性,然后将它们合并到一个大数组中。

问题是我尝试了这个approach,但它不起作用。

那么我如何交错未知数量的仅在运行时才知道的属性? INPUT_LAYOUT_DESC 中的 alignbyteoffset 应该是什么?如何交错数据 OpenGL 样式?

【问题讨论】:

  • 对于任意模型,您不要将它们存储为强类型结构。您只需创建一个与顶点缓冲区的二进制布局匹配的 InputLayout 并使用它。有关示例,请参阅 DirectX 工具包 Model。着色器绑定的主要问题是着色器需要以一致的顺序排列属性。
  • 我是将数据存储为实际交错的 XMFLOAT 数据类型,还是创建一个大的浮点数组并指定字节偏移量?由于数据必须以 16 字节的边界对齐,因此后者甚至可以工作吗?
  • VertexBuffer 和 IndexBuffer 通常只是动态顶点布局的字节数组。
  • 如果我想将 float 和 int[vertex Joint] 数据交错到一个字节数组中,我该怎么做?

标签: c++ directx vertex-attributes


【解决方案1】:

经过几天的类型化结构和错误,我终于找到了使用 memcpy 的方法

您可以使用这种技术将几乎任何类型的对象或原始数据类型交错到一个 char 数组中

DirectX::XMFLOAT2 vertices[4] =
 {
   DirectX::XMFLOAT2(0.5f,0.5f)
  ,DirectX::XMFLOAT2(-0.5f,0.5f)
  ,DirectX::XMFLOAT2(-0.5f,-0.5f)
  ,DirectX::XMFLOAT2(0.5f,-0.5f)
 };

 DirectX::XMINT3 colors[4] =
 {
   DirectX::XMINT3(1,0,0)
  ,DirectX::XMINT3(0,1,0)
  ,DirectX::XMINT3(1,0,1)
  ,DirectX::XMINT3(1,1,0)
 };

 char data[sizeof(DirectX::XMFLOAT2) * 4 + sizeof(DirectX::XMINT3) * 4];
 char* ptr = data;
 DirectX::XMFLOAT2* vertex = vertices;
 DirectX::XMINT3* color = colors;

 for (int i = 0; i < 4; i++)
 {
   memcpy(ptr, vertex, sizeof(DirectX::XMFLOAT2)); //Copy & increment char pointer and vertex pointer
   ptr += sizeof(DirectX::XMFLOAT2);
   vertex += 1;

   memcpy(ptr, color, sizeof(DirectX::XMINT3)); //Copy & increment char pointer and color pointer
   ptr += sizeof(DirectX::XMINT3);
   color += 1;
 }

对此解决方案的任何建议或修改都将被广泛接受

至于 alignbyteOffset 我们可以使用 D3D11_APPEND_ALIGNED_ELEMENT 而不必担心

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多