我对HLSL缓冲区对齐有问题。我有一个大小为48的数组中的灯光结构(即一个着色器最多可以容纳48个灯光)。(Divisiors是16字节边界的标记)
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++端不同。
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的汇编:
// 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 -这怎么可能?
发布于 2020-11-30 21:30:40
正如您在C++端正确地注意到的,您的ShaderLight数据只包含72字节的“已用”数据,因此在末尾有8字节的填充。然而,在HLSL端,数组中的最后一个元素不需要这8个填充字节,因为后续元素( NumLight整数)可以打包在这些填充字节中。
您可以通过不仅在HLSL端指定int pad[2];,而且在您的C++代码中指定HLSL端来轻松解决此问题。
https://stackoverflow.com/questions/64993081
复制相似问题