结构化缓冲区是否有特殊的对齐约束?

问题描述 投票:0回答:1

我正在我的渲染器中实现实例化。为此,我需要使用网格数据的 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;
};

结构化缓冲区是否有特殊的对齐约束?

graphics 3d directx directx-12
1个回答
0
投票

与常量缓冲区不同,D3D12 中的结构化缓冲区没有特殊的对齐约束。然而,在早期的硬件上,一些供应商确实提倡 16 字节对齐以提高性能,但我认为这不会对现代 GPU 产生明显影响。 因此,无需将 C++

struct
声明与
__declspec(align(x))
进行字节对齐。如果您确实包含
declspec
指令,那么这可能只会迫使您在 C++ 和 HLSL
struct
声明中添加不必要的填充以保持它们对齐。

© www.soinside.com 2019 - 2024. All rights reserved.