D3D12使用SetGraphicsRootDescriptorTable出现描述符类型不匹配错误如何解决
根因分析
- 根签名配置错误:你声明的像素着色器使用单个
Texture2DArray资源,仅需1个SRV绑定到t0寄存器,但根签名中ranges[0]的SRV数量被设置为4。D3D12运行时会校验描述符表基地址后连续对应数量的描述符类型是否匹配,因此绑定基地址之后的3个描述符也会被检查。 - 校验范围越界:你的描述符堆前8个描述符为SRV(7个网格纹理+1个ImGui SRV),后续3个为CBV。当
indexMesh=5时,基地址偏移3后对应堆内偏移8,属于CBV区域,触发类型不匹配;当indexMesh=6时,基地址偏移3后对应堆内偏移9,因此出现两个报错,和你观察到的现象完全一致。
修复方案
根据你的使用场景选择对应修复方式:
场景1:使用纹理数组作为输入
直接修改根签名SRV范围的描述符数量为1,匹配着色器需求即可:
ranges[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 1, 0, 0, D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC);
修改后仅校验传入基地址对应的单个描述符,只要indexMesh落在0~7的SRV区间内就不会触发报错。
场景2:需要绑定4个独立2D纹理
修改像素着色器声明,将Texture2DArray改为4个独立的Texture2D资源,绑定indexMesh时保证其最大值不超过4,避免校验范围落到CBV区域即可。
内容的提问来源于stack exchange,提问作者wahaha
相关产品推荐
相关产品推荐

