You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:36:04