DX12 HLSL中根常量nShadowIndex固定为0不生效问题排查
问题原因1:HLSL常量缓冲区packoffset配置错误
你定义的cbuffer cbLightInfo只有两个int成员,每个占4字节,总长度8字节,正好对应根参数2配置的2个32位常量空间。
当前代码中nShadowIndex被指定到packoffset(c4),而HLSL的packoffset(cN)中N代表16字节大小的常量寄存器序号,c4相当于偏移了4*16=64字节的位置,远超出根参数绑定的8字节范围,所以着色器读取到的永远是该内存位置的默认初始值0。
修复方式
修改HLSL中cbLightInfo的定义,修正packoffset配置:
cbuffer cbLightInfo : register(b2) { int nLights : packoffset(c0.x); // 显式指定占用c0寄存器第一个32位分量 int nShadowIndex : packoffset(c0.y); // 占用c0寄存器第二个32位分量 }
你也可以直接删除两个成员的packoffset声明,HLSL会自动按顺序对齐排布这两个int,结果也是正确的。
可选排查项:常量缓冲区数组动态索引校验
如果修复packoffset后问题仍存在,需要确认两点:
- 你的HLSL编译选项没有禁用常量缓冲区动态索引,fxc编译器默认是支持该特性的
- 确认绘制每一级级联阴影前都调用了
UpdateShaderVariables传入了正确的nShadowIndex参数,且绘制调用之间没有重置根参数
内容的提问来源于stack exchange,提问作者Shark_Bladder
相关产品推荐
相关产品推荐

