셰이더 라이브러리 패키지

여기서는 셰이더 코드를 컴파일하고, 컴파일된 코드를 셰이더 라이브러리에 로드하고, 원본 슬롯에서 대상 슬롯으로 리소스를 바인딩하는 방법을 보여 줍니다.

목표: 셰이더 연결에 사용할 셰이더 라이브러리를 패키지합니다.

필수 구성 요소

사용자가 C++에 익숙하다고 가정합니다. 그래픽 프로그래밍 개념에 대한 기본 경험도 필요합니다.

완료 시간: 30분입니다.

지침

1. 셰이더 코드를 컴파일합니다.

컴파일 함수 중 하나를 사용하여 셰이더 코드를 컴파일합니다. 예를 들어, 이 코드 조각은 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
        );

원본 문자열에는 컴파일되지 않은 ASCII HLSL 코드가 포함되어 있습니다.

2. 컴파일된 코드를 셰이더 라이브러리에 로드합니다.

D3DLoadModule 함수를 호출하여 컴파일된 코드(ID3DBlob)를 모듈(ID3D11Module) 셰이더 라이브러리를 나타냅니다.

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

3. 원본 슬롯에서 대상 슬롯으로 리소스를 바인드합니다.

ID3D11Module::CreateInstance 메서드를 호출하여 라이브러리의 인스턴스(ID3D11ModuleInstance)를 만든 다음 인스턴스에 대한 리소스 바인딩을 정의할 수 있습니다.

ID3D11ModuleInstance의 바인딩 메서드를 호출하여 원본 슬롯에서 대상 슬롯으로 필요한 리소스를 바인딩합니다. 리소스는 텍스처, 버퍼, 샘플러, 상수 버퍼 또는 UAV가 될 수 있습니다. 일반적으로 원본 라이브러리와 동일한 슬롯을 사용합니다.

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

이 HLSL 코드는 원본 라이브러리가 ID3D11ModuleInstance의 앞선 바인딩 메서드에 사용된 슬롯과 동일한 슬롯(t0, s0, b0, b1 및 b2)을 사용함을 보여 줍니다.

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

요약 및 다음 단계

셰이더 코드를 컴파일하고, 컴파일된 코드를 셰이더 라이브러리에 로드하고, 원본 슬롯에서 대상 슬롯으로 리소스를 바인딩했습니다.

다음으로 셰이더용 FLG(함수 연결 그래프)를 구성하고 컴파일된 코드에 연결하고 Direct3D 런타임에서 사용할 수 있는 셰이더 Blob을 생성합니다.

함수 연결 그래프 구문 및 컴파일된 코드에 연결

셰이더 연결 사용