我正在我的渲染器中实现实例化。为此,我需要使用网格数据的 StructuredBuffer。这是我第一次尝试的:
struct MeshData
{
float4x4 transform;
uint meshId;
};
StructuredBuffer<MeshData> meshDatas : register(t0);
和CPP方面:
__declspec(align(16)) struct MeshData
{
DirectX::XMFLOAT4X4 transform;
UINT meshId;
};
从现在起,我只需要将 CPP 结构对齐到 16 字节,就可以正确地将它们发送到 GPU。 但为了解决这个问题,我必须在 CPP 代码和 HLSL 上添加填充。这个有效:
HLSL:
struct MeshData
{
float4x4 transform;
uint groupId;
float pad1;
float pad2;
float pad3;
};
StructuredBuffer<MeshData> meshDatas : register(t0);
CPP
struct MeshData
{
DirectX::XMFLOAT4X4 transform;
UINT groupId;
FLOAT pad1;
FLOAT pad2;
FLOAT pad3;
};
结构化缓冲区是否有特殊的对齐约束?
与常量缓冲区不同,D3D12 中的结构化缓冲区没有特殊的对齐约束。然而,在早期的硬件上,一些供应商确实提倡 16 字节对齐以提高性能,但我认为这不会对现代 GPU 产生明显影响。 因此,无需将 C++
struct
声明与 __declspec(align(x))
进行字节对齐。如果您确实包含 declspec
指令,那么这可能只会迫使您在 C++ 和 HLSL struct
声明中添加不必要的填充以保持它们对齐。