2016-05-25 12 views
1

Wie kann ich Ressourcen an verschiedene Shaderstufen in D3D12 binden?DirectX 12 Ressourcenbindung

Ich schrieb zwei Shadern, ein Vertexshader und einen Pixelshader:

Hier ist der Vertex-Shader:

//VertexShader.vs 

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

Hier ist der Pixelshader:

//PixelShader.ps 

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

Wenn ich diese beiden Shadern kompilieren mit der D3DCompile Funktion und spiegeln Sie es mit der D3DReflect und untersuchen Sie die BoundResorces Mitglied in der Shader-Beschreibung, die sie beide haben Ein konstanter Puffer namens $ Params mit enthält jeweils die einheitliche Variable. Das Problem ist, dass diese beiden Puffer an Steckplatz 0 gebunden sind. Beim Binden von Ressourcen muss ich die ID3D12RootSignature-Schnittstelle verwenden, die Ressourcen an die Ressourcensteckplätze binden kann. Wie kann ich den $ Params-Puffer des Vertex-Shaders nur an den Vertex-Shader und den $ Params-Puffer des Pixel-Shaders nur an den Pixel-Shader binden?

Vielen Dank im Voraus,

Philinator

Antwort

1

Mit DX12, hier die performanten Lösung ist eine Wurzel Signatur zu erstellen, die Ihre Anwendung Bedürfnisse erfüllen, und im Idealfall declare it in your HLSL auch. Sie möchten die Stammsignaturen nicht oft ändern, daher möchten Sie auf jeden Fall einen erstellen, der für einen großen Teil Ihrer Shader funktioniert.

Denken Sie daran, DX12 ist Direct3D ohne Trainingsräder, Magie oder Shader-Patching, so dass Sie alles explizit selbst tun müssen. Ease-of-Use ist ein Nicht-Ziel für Direct3D 12. Es gibt viele gute Gründe, bei Direct3D 11 zu bleiben, es sei denn, Ihre Anwendungs- und Entwickler-Ressourcen verdienen die zusätzliche Kontrolle, die Ihnen Direct3D 12 bietet. Mit großer Macht kommt große Verantwortung.

Ich glaube, können Sie erreichen, was Sie mit etwas wie wünschen:

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())));