Condividi tramite


Creazione del pacchetto di una libreria shader

Qui viene illustrato come compilare il codice shader, caricare il codice compilato in una libreria shader e associare le risorse dagli slot di origine agli slot di destinazione.

Obiettivo: Per creare un pacchetto di una libreria shader da usare per il collegamento di shader.

Prerequisiti

Partiamo dal presupposto che tu abbia familiarità con C++. Devi inoltre avere un'esperienza di base dei concetti di programmazione di grafica.

Tempo di completamento: 30 minuti.

Istruzioni

1. Compilazione del codice shader

Compilare il codice shader con una delle funzioni di compilazione. Ad esempio, questo frammento di codice usa D3DCompile.

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

La stringa di origine contiene il codice ASCII HLSL non compilato.

2. Caricare il codice compilato in una libreria shader.

Chiamare la funzione D3DLoadModule per caricare il codice compilato (ID3DBlob) in un modulo (ID3D11Module) che rappresenta una libreria shader.

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

3. Associare le risorse dagli slot di origine agli slot di destinazione.

Chiamare il metodo ID3D11Module::CreateInstance per creare un'istanza (ID3D11ModuleInstance) della libreria in modo da poter quindi definire associazioni di risorse per l'istanza.

Chiamare i metodi di associazione di ID3D11ModuleInstance per associare le risorse necessarie dagli slot di origine agli slot di destinazione. Le risorse possono essere trame, buffer, campionatori, buffer costanti o UAV. In genere, si useranno gli stessi slot della libreria di origine.

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

Questo codice HLSL mostra che la libreria di origine usa gli stessi slot (t0, s0, b0, b1 e b2) degli slot usati nei metodi di associazione precedenti di ID3D11ModuleInstance.

// 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;
};

Riepilogo e passaggi successivi

Il codice shader è stato compilato, caricato il codice compilato in una libreria shader e le risorse associate dagli slot di origine agli slot di destinazione.

Successivamente si creano grafici di collegamento a funzioni (FLG) per gli shader, li si collega al codice compilato e si producono BLOB shader che il runtime Direct3D può usare.

Creazione di un grafo di collegamento di funzioni e collegamento al codice compilato

Uso del collegamento di shader