Mengemas pustaka shader

Di sini kami menunjukkan kepada Anda cara mengkompilasi kode shader Anda, memuat kode yang dikompilasi ke pustaka shader, dan mengikat sumber daya dari slot sumber ke slot tujuan.

Tujuan: Untuk mengemas pustaka shader yang akan digunakan untuk penautan shader.

Prasyarat

Kami berasumsi bahwa Anda terbiasa dengan C++. Anda juga memerlukan pengalaman dasar dengan konsep pemrograman grafis.

Waktu selesai: 30 menit.

Petunjuk

1. Mengkompilasi kode shader Anda

Kompilasi kode shader Anda dengan salah satu fungsi kompilasi. Misalnya, cuplikan kode ini menggunakan 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
        );

String sumber berisi kode HLSL ASCII yang tidak dikompilasi.

2. Muat kode yang dikompilasi ke pustaka shader.

Panggil fungsi D3DLoadModule untuk memuat kode yang dikompilasi (ID3DBlob) ke dalam modul (ID3D11Module) yang mewakili pustaka shader.

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

3. Mengikat sumber daya dari slot sumber ke slot tujuan.

Panggil metode ID3D11Module::CreateInstance untuk membuat instans (ID3D11ModuleInstance) pustaka sehingga Anda kemudian dapat menentukan pengikatan sumber daya untuk instans.

Panggil metode pengikatan ID3D11ModuleInstance untuk mengikat sumber daya yang Anda butuhkan dari slot sumber ke slot tujuan. Sumber daya dapat berupa tekstur, buffer, sampler, buffer konstan, atau UAV. Biasanya, Anda akan menggunakan slot yang sama dengan pustaka sumber.

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

Kode HLSL ini menunjukkan bahwa pustaka sumber menggunakan slot yang sama (t0, s0, b0, b1, dan b2) sebagai slot yang digunakan dalam metode ikatan sebelumnya 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;
};

Ringkasan dan langkah berikutnya

Kami mengkompilasi kode shader, memuat kode yang dikompilasi ke dalam pustaka shader, dan mengikat sumber daya dari slot sumber ke slot tujuan.

Selanjutnya kita membangun function-linking-graphs (FLG) untuk shader, menautkannya ke kode yang dikompilasi, dan menghasilkan blob shader yang dapat digunakan runtime Direct3D.

Membuat grafik penautan fungsi dan menautkannya ke kode yang dikompilasi

Menggunakan penautan shader