Partager via


Empaquetage d’une bibliothèque de nuanceurs

Ici, nous vous montrons comment compiler votre code de nuanceur, charger le code compilé dans une bibliothèque de nuanceurs et lier les ressources des emplacements sources aux emplacements de destination.

Objectif: Pour empaqueter une bibliothèque de nuanceurs à utiliser pour la liaison du nuanceur.

Prérequis

Nous partons du principe que vous êtes familiarisé avec C++. Vous avez également besoin d’une expérience de base dans les concepts de programmation graphique.

Durée d’exécution : 30 minutes.

Instructions

1. Compilation de votre code de nuanceur

Compilez votre code de nuanceur avec l’une des fonctions de compilation. Par exemple, cet extrait de code utilise 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 chaîne source contient le code HLSL ASCII non compilé.

2. Chargez le code compilé dans une bibliothèque de nuanceur.

Appelez la fonction D3DLoadModule pour charger le code compilé (ID3DBlob) dans un module (ID3D11Module) qui représente une bibliothèque de nuanceurs.

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

3. Lier les ressources des emplacements sources aux emplacements de destination.

Appelez la méthode ID3D11Module::CreateInstance pour créer un instance (ID3D11ModuleInstance) de la bibliothèque afin de pouvoir ensuite définir des liaisons de ressources pour le instance.

Appelez les méthodes de liaison d’ID3D11ModuleInstance pour lier les ressources dont vous avez besoin des emplacements sources aux emplacements de destination. Les ressources peuvent être des textures, des tampons, des échantillonneurs, des mémoires tampons constantes ou des UAV. En règle générale, vous utiliserez les mêmes emplacements que la bibliothèque source.

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

Ce code HLSL indique que la bibliothèque source utilise les mêmes emplacements (t0, s0, b0, b1 et b2) que les emplacements utilisés dans les méthodes de liaison précédentes d’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;
};

Résumé et étapes suivantes

Nous avons compilé le code de nuanceur, chargé le code compilé dans une bibliothèque de nuanceurs et lié les ressources des emplacements sources aux emplacements de destination.

Ensuite, nous construisons des graphiques de liaison de fonction (FLG) pour les nuanceurs, les liez au code compilé et produisons des objets blob de nuanceur que le runtime Direct3D peut utiliser.

Construction d’un graphique de liaison de fonction et liaison de celui-ci à du code compilé

Utilisation de la liaison de nuanceur