【问题标题】:aligned_malloc() vs alignas() for Constant Buffers常量缓冲区的aligned_malloc() vs alignas()
【发布时间】:2020-05-05 00:18:05
【问题描述】:

在 C++ 中,我们有关键字 alignas(n) 和 _aligned_malloc(m,n) 函数。
alignas 适用于该类型,而 aligned_malloc 适用于您所称的任何类型。
我可以使用alignas(16) 来满足 Direct3D 常量缓冲区的 16 字节对齐要求吗?

【问题讨论】:

    标签: malloc direct3d11 alignas


    【解决方案1】:

    是的,你可以这样使用它:

    struct SceneConstantBuffer
    {
        alignas(16) DirectX::XMFLOAT4X4 ViewProjection[2];
        alignas(16) DirectX::XMFLOAT4 EyePosition[2];
        alignas(16) DirectX::XMFLOAT3 LightDirection{};
        alignas(16) DirectX::XMFLOAT3 LightDiffuseColor{};
        alignas(16) int NumSpecularMipLevels{ 1 };
    };
    

    不行的是__declspec(align)...

    编辑:如果你想在结构本身上使用它,类似的东西也应该工作:

    struct alignas(16) SceneConstantBuffer
    {
        DirectX::XMMATRIX ViewProjection; // 16-bytes
        ...
        DirectX::XMFLOAT3 LightDiffuseColor{};
    }
    

    【讨论】:

    • 我可以在SceneConstantBuffer 上使用alignas(16) 还是必须在每个成员上都使用它?
    • @Raildex:是的,请参阅编辑。当你用断言初始化它时,你会想要检查它。
    • 谢谢!还有一个问题:常量缓冲区的成员需要对齐还是只对齐常量缓冲区本身?
    • @Raildex:是的,仍然需要对齐,因此如果需要,通常使用填充来弥补差异。检查this answer,它应该可以让你知道什么是在工作,干杯!
    猜你喜欢
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多