1

如何将资源绑定到 D3D12 中的不同着色器阶段?

我写了两个着色器,一个顶点着色器和一个像素着色器:

这是顶点着色器:

//VertexShader.vs

float4 main(float3 posL : POSITION, uniform float4x4 gWVP) : SV_POSITION
{
    return mul(float4(posL, 1.0f), gWVP);
}

这是像素着色器:

//PixelShader.ps

float4 main(float4 PosH : SV_POSITION, uniform float4 Color) : SV_Target
{
    return Color;
}

如果我用函数编译这两个着色器D3DCompile并用 反映它D3DReflect并检查着色器描述中的 BoundResorces 成员,它们都有一个名为 $Params 的常量缓冲区,分别包含统一变量。问题是这两个缓冲区都绑定到插槽 0。绑定资源时,我必须使用 ID3D12RootSignature 接口,该接口可以将资源绑定到资源插槽。如何将顶点着色器的 $Params 缓冲区仅绑定到顶点着色器,将像素着色器的 $Params 缓冲区仅绑定到像素着色器?

提前致谢,

集邮者

4

1 回答 1

1

使用 DX12,这里的高性能解决方案是创建一个满足您的应用程序需求的根签名,并在理想情况下在您的 HLSL中声明它。您不想经常更改根签名,因此您肯定希望制作一个适用于大部分着色器的根签名。

请记住,DX12 是 Direct3D,没有辅助轮、魔术或着色器修补,因此您只需自己明确地完成所有操作。易用性是 Direct3D 12 的非目标。有很多充分的理由坚持使用 Direct3D 11,除非您的应用程序和开发人员资源值得 Direct3D 12 为您提供的额外控制。权力越大,责任越大

我相信您可以通过以下方式实现您想要的:

CD3DX12_DESCRIPTOR_RANGE descRange[1];
descRange[0].Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0);
CD3DX12_ROOT_PARAMETER rootParameters[2];
rootParameters[0].InitAsDescriptorTable(
    1, &descRange[0], D3D12_SHADER_VISIBILITY_VERTEX); // b0
rootParameters[1].InitAsDescriptorTable(
    1, &descRange[0], D3D12_SHADER_VISIBILITY_PIXEL); // b0

// Create the root signature.
CD3DX12_ROOT_SIGNATURE_DESC rootSignatureDesc(_countof(rootParameters),
     rootParameters, 0, nullptr,
     D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);

ComPtr<ID3DBlob> signature;
ComPtr<ID3DBlob> error;
DX::ThrowIfFailed(D3D12SerializeRootSignature(&rootSignatureDesc,
     D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error));
DX::ThrowIfFailed(
    device->CreateRootSignature(0, signature->GetBufferPointer(),
        signature->GetBufferSize(),
        IID_PPV_ARGS(m_rootSignature.ReleaseAndGetAddressOf())));
于 2016-05-26T05:33:23.737 回答