CSDN-Ada助手 2023-06-18 10:36 采纳率: 1.6%
浏览 11

关于#c语言#的问题:在将根签名与SRV描述符堆绑定时

该问题来自社区帖: https://bbs.csdn.net/topics/616057354.为符合问答规范, 该问题经过ChatGPT优化

在将根签名与SRV描述符堆绑定时,我使用了以下代码:

commandList->SetGraphicsRootDescriptorTable(0, Srv->GetGPUDescriptorHandleForHeapStart());

然而,我遇到了访问位置冲突的问题。

  • 写回答

1条回答 默认 最新

  • 火花怪怪 2023-06-18 13:01
    关注

    **答案参考ChatGPT ,如果有参考价值麻烦采纳一下,谢谢啦!!_**

    访问位置冲突通常是由于使用了错误的描述符范围或堆大小导致的。在使用SetGraphicsRootDescriptorTable函数时,你需要确保指定的描述符范围与你绑定的SRV描述符堆的大小相同。

    以下是一些可能有用的解决方案:

    确保你的SRV描述符堆已经正确创建和初始化。你可以使用GPU调试器或其他工具来检查SRV描述符堆的状态和大小。

    确保你的描述符范围的大小与SRV描述符堆的大小相同。你可以使用描述符范围的Create函数来指定描述符堆的大小,例如:

    
    ```c
    
    D3D12_DESCRIPTOR_RANGE DescRange = {};
    DescRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
    DescRange.NumDescriptors = NumDescriptors;
    DescRange.BaseShaderRegister = BaseShaderRegister;
    DescRange.RegisterSpace = RegisterSpace;
    DescRange.OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
    
    其中,NumDescriptors参数指定了描述符堆的大小。
    
    确保你的SRV描述符堆已经与根签名相关联,并且已经绑定到了对应的描述符范围。你可以使用以下代码将SRV描述符堆与对应的描述符范围相关联:
    
    ```c
    D3D12_ROOT_DESCRIPTOR_TABLE DescriptorTable;
    DescriptorTable.NumDescriptorRanges = 1;
    DescriptorTable.pDescriptorRanges = &DescRange;
    
    D3D12_ROOT_PARAMETER RootParameter;
    RootParameter.ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
    RootParameter.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL;
    RootParameter.DescriptorTable = DescriptorTable;
    
    D3D12_ROOT_SIGNATURE_DESC RootSignatureDesc;
    RootSignatureDesc.NumParameters = 1;
    RootSignatureDesc.pParameters = &RootParameter;
    RootSignatureDesc.NumStaticSamplers = 0;
    RootSignatureDesc.pStaticSamplers = nullptr;
    RootSignatureDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
    
    ComPtr<ID3DBlob> SerializedRootSignature;
    ComPtr<ID3DBlob> ErrorBlob;
    HRESULT hr = D3D12SerializeRootSignature(&RootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &SerializedRootSignature, &ErrorBlob);
    if (FAILED(hr))
    {
        // 处理错误
    }
    
    hr = Device->CreateRootSignature(0, SerializedRootSignature->GetBufferPointer(), SerializedRootSignature->GetBufferSize(), IID_PPV_ARGS(&RootSignature));
    if (FAILED(hr))
    {
        // 处理错误
    }
    
    CommandList->SetGraphicsRootSignature(RootSignature.Get());
    CommandList->SetGraphicsRootDescriptorTable(0, Srv->GetGPUDescriptorHandleForHeapStart());
    
    

    在以上代码中,我们定义了一个描述符范围和一个根参数,并将其打包到一个根签名描述中。然后,我们使用D3D12SerializeRootSignature函数将根签名描述序列化为一个二进制Blob,最后使用CreateRootSignature函数创建根签名。在创建根签名之后,我们使用SetGraphicsRootSignature函数将其绑定到命令列表,并使用SetGraphicsRootDescriptorTable函数将SRV描述符堆绑定到描述符范围。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月18日