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

如何修复D3D12中Root Signature与Vertex Shader不匹配的错误?

D3D12根签名与顶点着色器不匹配错误解决

这个错误的核心是:你的顶点着色器中引用了一个CBV描述符范围(寄存器6,空间0),但当前创建的根签名里没有为这个资源绑定对应的条目,导致管线创建时校验失败。

具体解决步骤:

  1. 确认着色器中的资源定义
    先检查顶点着色器代码,找到对应的CBV定义,比如:

    cbuffer ShadowCB : register(b6, space0) {
        // 阴影相关常量数据
    }
    

    记下它的BaseShaderRegister=6、RegisterSpace=0、类型是CBV这三个关键信息。

  2. 修改根签名创建代码,添加对应绑定
    在根签名的参数列表中,新增一个匹配该CBV的描述符表或根CBV条目:

    • 如果用描述符表绑定(适合多个资源或动态更新的场景):
      // 定义CBV描述符范围
      CD3DX12_DESCRIPTOR_RANGE shadowCbvRange;
      shadowCbvRange.Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 6, 0);
      // 类型=CBV,数量=1,起始寄存器=6,空间=0
      
      // 创建对应的根参数
      CD3DX12_ROOT_PARAMETER shadowRootParam;
      shadowRootParam.InitAsDescriptorTable(1, &shadowCbvRange, D3D12_SHADER_VISIBILITY_VERTEX);
      // 只对顶点着色器可见(如果像素着色器也需要,改成ALL)
      
      // 将这个参数加入到根参数数组中,再生成根签名
      CD3DX12_ROOT_SIGNATURE_DESC rootSigDesc;
      rootSigDesc.Init(
          原参数数量+1, 根参数数组(包含新增的shadowRootParam),
          0, nullptr,
          D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT
      );
      
      // 序列化并创建根签名
      ComPtr<ID3DBlob> rootSigBlob, errorBlob;
      HRESULT hr = D3D12SerializeRootSignature(
          &rootSigDesc, D3D_ROOT_SIGNATURE_VERSION_1_0,
          &rootSigBlob, &errorBlob
      );
      if (FAILED(hr)) {
          // 输出错误信息
          if (errorBlob) OutputDebugStringA((char*)errorBlob->GetBufferPointer());
          return hr;
      }
      hr = device->CreateRootSignature(
          0, rootSigBlob->GetBufferPointer(), rootSigBlob->GetBufferSize(),
          IID_PPV_ARGS(&rootSignature)
      );
      
    • 如果这个CBV是固定大小的常量缓冲区,也可以直接用根CBV绑定(更高效):
      CD3DX12_ROOT_PARAMETER shadowRootParam;
      shadowRootParam.InitAsConstantBufferView(6, 0, D3D12_SHADER_VISIBILITY_VERTEX);
      // 寄存器=6,空间=0,对顶点着色器可见
      
  3. 校验一致性

    • 确保所有着色器(顶点、像素等)中用到的CBV/SRV/UAV等资源,在根签名里都有对应的绑定条目,寄存器号和空间必须完全匹配。
    • 可以用D3D12调试工具(如PIX)的着色器分析功能,查看着色器的资源引用列表,和根签名的定义逐一对比,排查遗漏。
  4. 重新编译测试
    重新编译着色器和根签名代码,再次调用CreateGraphicsPipelineState,确认错误消失。

内容的提问来源于stack exchange,提问作者yoon-0012

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:04:59