使用shaderc编译HLSL并经SPIRV-Cross分析后UBO尺寸异常问题
问题解答
首先明确:HLSL的默认CBUFFER(对应GL/Vulkan的UBO)布局确实有16字节的强制对齐要求,你遇到的32字节是这个规则导致的结果:
- HLSL默认布局中,所有向量类型(包括矩阵的每一列)的对齐边界都是16字节(也就是4个float的大小),哪怕是float2这种仅占8字节的向量。
- 对于
float2x2矩阵,HLSL会将其视为两个float2列向量的集合,每个列向量都要对齐到16字节,所以每个列实际占用16字节(前8字节是有效数据,后8字节是填充),两个列加起来就是32字节,这就是SPIRV-Cross识别到的总尺寸。
你改成
vector<float,4>后正常工作,是因为这个类型本身就是16字节,刚好符合默认的16字节对齐要求,没有额外填充,所以总尺寸和预期一致。如果你想让HLSL的UBO布局和启用
GL_EXT_scalar_block_layout的GLSL一致(也就是按标量对齐,无强制16字节向量对齐),可以在HLSL中做以下操作:- 针对Vulkan编译目标,给CBUFFER添加
[[vk::scalar_block_layout]]属性,比如:cbuffer MyUBO [[vk::scalar_block_layout]] { float2x2 mat; }; - 或者在使用shaderc编译时,添加启用标量布局的编译选项,强制按标量规则布局,这样
float2x2就会占用16字节,和你预期的一致。
- 针对Vulkan编译目标,给CBUFFER添加
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

