C++ directx 11 如何交错未知数量的顶点属性
C++ directx 11 how to interleave unknown number of vertex attributes
我看过很多文章说通过将数据放入结构中来交错顶点属性
struct Vertex
{
XMFLOAT2A vertex;
XMFLOAT3A color;
.
.
.
}
这适用于教程,但适用于从 obj、colladae 文件等加载的真实世界模型。不可能事先知道网格包含多少属性,并且您无法编写包含所有可能组合的每个可能结构属性。
唯一的解决办法是先读取所有属性,然后将它们合并到一个大数组中。
问题是我试过了 approach 但它不起作用。
那么我如何交错仅在 运行 时间已知的未知数量的属性? INPUT_LAYOUT_DESC 中的 alignbyteoffset 应该是什么?如何交错数据 OpenGL 样式?
经过几天的输入结构和错误,我终于找到了使用 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 而不必担心
我看过很多文章说通过将数据放入结构中来交错顶点属性
struct Vertex
{
XMFLOAT2A vertex;
XMFLOAT3A color;
.
.
.
}
这适用于教程,但适用于从 obj、colladae 文件等加载的真实世界模型。不可能事先知道网格包含多少属性,并且您无法编写包含所有可能组合的每个可能结构属性。
唯一的解决办法是先读取所有属性,然后将它们合并到一个大数组中。
问题是我试过了 approach 但它不起作用。
那么我如何交错仅在 运行 时间已知的未知数量的属性? INPUT_LAYOUT_DESC 中的 alignbyteoffset 应该是什么?如何交错数据 OpenGL 样式?
经过几天的输入结构和错误,我终于找到了使用 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 而不必担心