首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HLSL对齐问题

HLSL对齐问题
EN

Stack Overflow用户
提问于 2020-11-25 02:56:31
回答 1查看 145关注 0票数 0

我对HLSL缓冲区对齐有问题。我有一个大小为48的数组中的灯光结构(即一个着色器最多可以容纳48个灯光)。(Divisiors是16字节边界的标记)

代码语言:javascript
复制
struct RendererLight {
    float4 Position;
    //---//
    float4 Color;
    //---//
    float4 Direction;
    //---//
    float Intensity;
    float In;
    float Out;
    float Range;
    //---//
    int bakedLight;
    int dynamicLight;
    //---//
};


cbuffer LightsBuffer : register(b1)
{
    RendererLight Lights[48];
    //---//
    int NumLights;
    //---//
};

由于某些原因,其大小与结构的c++端不同。

代码语言:javascript
复制
struct ShaderLight {
    Vector4 Position;
    Vector4 Color;
    Vector4 Direction;
    float Intensity;
    float In;
    float Out;
    float Range;
    int baked;
    int dynamic;
    int pad[2];
};

constexpr auto of5 = offsetof(ShaderLight, dynamic); //68 - correct
constexpr auto sz1 = sizeof(ShaderLight); // 80 - i think correct?

struct CLightBuffer {
    ShaderLight Lights[NUM_LIGHTS_PER_BUFFER];
    int NumLights;
    int pad[3];
};


constexpr auto sz = sizeof(CLightBuffer::Lights); // 3840 - incorrect; hlsl assembly says wants 3832 - 8 byte less
constexpr auto sz2 = sizeof(CLightBuffer); // 3844 - incorrect; 
constexpr auto of = offsetof(CLightBuffer, NumLights); // 3840  - incorrect; hlsl assembly wants 3832

下面是buffer的汇编:

代码语言:javascript
复制
// cbuffer LightsBuffer
// {
//
//   struct
//   {
//       
//       float4 Position;               // Offset:    0
//       float4 Color;                  // Offset:   16
//       float4 Direction;              // Offset:   32
//       float Intensity;               // Offset:   48
//       float In;                      // Offset:   52
//       float Out;                     // Offset:   56
//       float Range;                   // Offset:   60
//       int bakedLight;                // Offset:   64
//       int dynamicLight;              // Offset:   68
//
//   } Lights[48];                      // Offset:    0 Size:  3832
//   int NumLights;                     // Offset: 3832 Size:     4
//
// }

我不太明白为什么HLSL数组的大小是3832。3832 / 48不是80而是79.83 -这怎么可能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-30 21:30:40

正如您在C++端正确地注意到的,您的ShaderLight数据只包含72字节的“已用”数据,因此在末尾有8字节的填充。然而,在HLSL端,数组中的最后一个元素不需要这8个填充字节,因为后续元素( NumLight整数)可以打包在这些填充字节中。

您可以通过不仅在HLSL端指定int pad[2];,而且在您的C++代码中指定HLSL端来轻松解决此问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64993081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档