Freigeben über


Verpacken einer Shaderbibliothek

Hier zeigen wir Ihnen, wie Sie Ihren Shadercode kompilieren, den kompilierten Code in eine Shaderbibliothek laden und Ressourcen von Quellslots an Zielslots binden.

Ziel: So packen Sie eine Shaderbibliothek, die für die Shaderverknüpfung verwendet werden soll.

Voraussetzungen

Es wird davon ausgegangen, dass Sie mit C+ vertraut sind. Sie müssen außerdem mit den grundlegenden Konzepten der Grafikprogrammierung vertraut sein.

Dauer: 30 Minuten.

Anweisungen

1. Kompilieren des Shadercodes

Kompilieren Sie Ihren Shadercode mit einer der Kompilierungsfunktionen. In diesem Codeausschnitt wird beispielsweise D3DCompile verwendet.

    string source;
 
    ComPtr<ID3DBlob> codeBlob;
    ComPtr<ID3DBlob> errorBlob;
    HRESULT hr = D3DCompile(
        source.c_str(),
        source.size(),
        "ShaderModule",
        NULL,
        NULL,
        NULL,
        ("lib" + m_shaderModelSuffix).c_str(),
        D3DCOMPILE_OPTIMIZATION_LEVEL3,
        0,
        &codeBlob,
        &errorBlob
        );

Die Quellzeichenfolge enthält den nicht kompilierten ASCII HLSL-Code.

2. Laden Sie den kompilierten Code in eine Shaderbibliothek.

Rufen Sie die Funktion D3DLoadModule auf, um den kompilierten Code (ID3DBlob) in ein Modul (ID3D11Module) zu laden, das eine Shaderbibliothek darstellt.

    // Load the compiled library code into a module object.
    ComPtr<ID3D11Module> shaderLibrary;
    DX::ThrowIfFailed(D3DLoadModule(codeBlob->GetBufferPointer(), codeBlob->GetBufferSize(), &shaderLibrary));

3. Binden von Ressourcen von Quellslots an Zielslots.

Rufen Sie die ID3D11Module::CreateInstance-Methode auf, um eine instance (ID3D11ModuleInstance) der Bibliothek zu erstellen, damit Sie dann Ressourcenbindungen für die instance definieren können.

Rufen Sie die Bindungsmethoden von ID3D11ModuleInstance auf, um die ressourcen, die Sie von Quellslots an Zielslots benötigen. Die Ressourcen können Texturen, Puffer, Sampler, Konstantenpuffer oder UAVs sein. In der Regel verwenden Sie dieselben Slots wie die Quellbibliothek.

    // Create an instance of the library and define resource bindings for it.
    // In this sample we use the same slots as the source library however this is not required.
    ComPtr<ID3D11ModuleInstance> shaderLibraryInstance;
    DX::ThrowIfFailed(shaderLibrary->CreateInstance("", &shaderLibraryInstance));
    // HRESULTs for Bind methods are intentionally ignored as compiler optimizations may eliminate the source
    // bindings. In these cases, the Bind operation will fail, but the final shader will function normally.
    shaderLibraryInstance->BindResource(0, 0, 1);
    shaderLibraryInstance->BindSampler(0, 0, 1);
    shaderLibraryInstance->BindConstantBuffer(0, 0, 0);
    shaderLibraryInstance->BindConstantBuffer(1, 1, 0);
    shaderLibraryInstance->BindConstantBuffer(2, 2, 0);

Dieser HLSL-Code zeigt, dass die Quellbibliothek dieselben Slots (t0, s0, b0, b1 und b2) wie die Slots verwendet, die in den vorherigen Bindungsmethoden von ID3D11ModuleInstance verwendet werden.

// This is the default code in the fixed header section.
Texture2D<float3> Texture : register(t0);
SamplerState Anisotropic : register(s0);
cbuffer CameraData : register(b0)
{
    float4x4 Model;
    float4x4 View;
    float4x4 Projection;
};
cbuffer TimeVariantSignals : register(b1)
{
    float SineWave;
    float SquareWave;
    float TriangleWave;
    float SawtoothWave;
};

// This code is not displayed, but is used as part of the linking process.
cbuffer HiddenBuffer : register(b2)
{
    float3 LightDirection;
};

Zusammenfassung und nächste Schritte

Wir haben Shadercode kompiliert, den kompilierten Code in eine Shaderbibliothek geladen und Ressourcen von Quellslots an Zielslots gebunden.

Als Nächstes erstellen wir FlGs (Function-Linking-Graph) für Shader, verknüpfen sie mit kompiliertem Code und erstellen Shaderblobs, die die Direct3D-Runtime verwenden kann.

Erstellen eines Funktionsverknüpfungsdiagramms und Verknüpfen mit kompiliertem Code

Verwenden der Shaderverknüpfung