Compartir a través de


Empaquetado de una biblioteca de sombreador

Aquí se muestra cómo compilar el código del sombreador, cargar el código compilado en una biblioteca de sombreador y enlazar recursos de ranuras de origen a ranuras de destino.

Objetivo: Para empaquetar una biblioteca de sombreador que se va a usar para la vinculación del sombreador.

Requisitos previos

Suponemos que estás familiarizado con C++. También necesitas tener experiencia básica en los conceptos de programación de elementos gráficos.

Tiempo de finalización: 30 minutos.

Instrucciones

1. Compilar el código del sombreador

Compile el código del sombreador con una de las funciones de compilación. Por ejemplo, este fragmento de código 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 cadena de origen contiene el código ASCII HLSL sin compilar.

2. Cargue el código compilado en una biblioteca de sombreador.

Llame a la función D3DLoadModule para cargar el código compilado (ID3DBlob) en un módulo (ID3D11Module) que representa una biblioteca de sombreador.

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

3. Enlace recursos de ranuras de origen a ranuras de destino.

Llame al método ID3D11Module::CreateInstance para crear una instancia (ID3D11ModuleInstance) de la biblioteca para poder definir enlaces de recursos para la instancia.

Llame a los métodos de enlace de ID3D11ModuleInstance para enlazar los recursos que necesita de ranuras de origen a ranuras de destino. Los recursos pueden ser texturas, búferes, muestreadores, búferes de constantes o UMV. Normalmente, usará las mismas ranuras que la biblioteca de origen.

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

Este código HLSL muestra que la biblioteca de origen usa las mismas ranuras (t0, s0, b0, b1 y b2) que las ranuras usadas en los métodos de enlace anteriores de 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;
};

Resumen y pasos siguientes

Compilamos código de sombreador, cargamos el código compilado en una biblioteca de sombreador y enlazamos recursos de ranuras de origen a ranuras de destino.

A continuación, creamos gráficos de vinculación de funciones (FLG) para sombreadores, los vinculamos al código compilado y generamos blobs de sombreador que el entorno de ejecución de Direct3D puede usar.

Construcción de un grafo de vinculación de función y vinculación a código compilado

Uso de la vinculación del sombreador