셰이더 라이브러리 패키지
여기서는 셰이더 코드를 컴파일하고, 컴파일된 코드를 셰이더 라이브러리에 로드하고, 원본 슬롯에서 대상 슬롯으로 리소스를 바인딩하는 방법을 보여 줍니다.
목표: 셰이더 연결에 사용할 셰이더 라이브러리를 패키지합니다.
필수 구성 요소
사용자가 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을 생성합니다.
관련 항목