효과의 상태 구성(Direct3D 11)
Direct3D 11을 사용하면 특정 파이프라인 단계에 대한 효과 상태가 구조별로 구성됩니다. 구조는 다음과 같습니다.
파이프라인 상태 | 구조체 |
---|---|
래스터화 | D3D11_RASTERIZER_DESC |
출력 병합기 | D3D11_BLEND_DESC 및 D3D11_DEPTH_STENCIL_DESC |
셰이더 | 아래 참조 |
애플리케이션에서 상태 변경 횟수를 더 많이 제어해야 하는 셰이더 단계의 경우 상태는 상수 버퍼 상태, 샘플러 상태, 셰이더 리소스 상태 및 정렬되지 않은 액세스 뷰 상태(픽셀 및 컴퓨팅 셰이더의 경우)로 나뉩니다. 이렇게 하면 변경 중인 상태만 업데이트하도록 신중하게 설계된 애플리케이션이 GPU에 전달되어야 하는 데이터의 양을 줄여 성능을 향상시킬 수 있습니다.
그렇다면 파이프라인 상태를 효과로 구성하려면 어떻게 해야 할까요?
대답은 주문이 중요하지 않다는 것입니다. 전역 변수를 맨 위에 배치할 필요가 없습니다. 그러나 SDK의 모든 샘플은 동일한 순서를 따르며 데이터를 동일한 방식으로 구성하는 것이 좋습니다. 따라서 DirectX SDK 샘플의 데이터 순서에 대한 간략한 설명입니다.
전역 변수
표준 C 사례와 마찬가지로 전역 변수는 먼저 파일 맨 위에 선언됩니다. 대부분 애플리케이션에서 초기화한 다음 효과에 사용되는 변수입니다. 경우에 따라 초기화되고 변경되지 않으며, 다른 시간에는 모든 프레임이 업데이트됩니다. C 함수 scope 규칙과 마찬가지로 효과 함수의 scope 외부에서 선언된 효과 변수는 효과 전체에 표시됩니다. 효과 함수 내에 선언된 변수는 해당 함수 내에서만 표시됩니다.
다음은 BasicHLSL10.fx에 선언된 변수의 예입니다.
// Global variables
float4 g_MaterialAmbientColor; // Material's ambient color
Texture2D g_MeshTexture; // Color texture for mesh
float g_fTime; // App's time in seconds
float4x4 g_mWorld; // World matrix for object
float4x4 g_mWorldViewProjection; // World * View * Projection matrix
// Texture samplers
SamplerState MeshTextureSampler
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
효과 변수에 대한 구문은 효과 변수 구문(Direct3D 11)에 자세히 설명되어 있습니다. 효과 텍스처 샘플러의 구문은 샘플러 형식(DirectX HLSL)에 자세히 설명되어 있습니다.
셰이더
셰이더는 작은 실행 프로그램입니다. HLSL 코드는 셰이더 기능을 구현하므로 셰이더를 셰이더 상태를 캡슐화하는 것으로 생각할 수 있습니다. 그래픽 파이프라인은 최대 5가지 종류의 셰이더입니다.
- 꼭짓점 셰이더 - 꼭짓점 데이터에서 작동합니다. 의 꼭짓점 하나가 하나의 꼭짓점을 생성합니다.
- 헐 셰이더 - 패치 데이터에서 작동합니다. 제어점 단계: 하나의 호출은 하나의 제어점을 생성합니다. 각 포크 및 조인 단계: 하나의 패치는 일정한 패치 상수 데이터를 생성합니다.
- 도메인 셰이더 - 기본 데이터에서 작동합니다. 하나의 기본 형식은 0, 1 또는 많은 기본 형식을 생성할 수 있습니다.
- 기하 도형 셰이더 - 기본 데이터에서 작동합니다. 의 한 기본 형식은 0, 1 또는 많은 기본 형식을 생성할 수 있습니다.
- 픽셀 셰이더 - 픽셀 데이터에서 작동합니다. 1픽셀의 출력은 1픽셀 출력됩니다(렌더링에서 픽셀이 컬링되지 않는 한).
컴퓨팅 셰이더 파이프라인은 하나의 셰이더를 사용합니다.
- 컴퓨팅 셰이더 - 모든 종류의 데이터에서 작동합니다. 출력은 스레드 수와 독립적입니다.
셰이더는 로컬 함수이며 C 스타일 함수 규칙을 따릅니다. 효과가 컴파일되면 각 셰이더가 컴파일되고 각 셰이더 함수에 대한 포인터가 내부적으로 저장됩니다. 컴파일에 성공하면 ID3D11Effect 인터페이스가 반환됩니다. 이 시점에서 컴파일된 효과는 중간 형식입니다.
컴파일된 셰이더에 대한 자세한 내용을 알아보려면 셰이더 리플렉션을 사용해야 합니다. 이는 기본적으로 런타임에 셰이더를 디컴파일하고 셰이더 코드에 대한 정보를 다시 반환하도록 요청하는 것과 같습니다.
struct VS_OUTPUT
{
float4 Position : SV_POSITION; // vertex position
float4 Diffuse : COLOR0; // vertex diffuse color
float2 TextureUV : TEXCOORD0; // vertex texture coords
};
VS_OUTPUT RenderSceneVS( float4 vPos : POSITION,
float3 vNormal : NORMAL,
float2 vTexCoord0 : TEXCOORD,
uniform int nNumLights,
uniform bool bTexture,
uniform bool bAnimate )
{
VS_OUTPUT Output;
float3 vNormalWorldSpace;
....
return Output;
}
struct PS_OUTPUT
{
float4 RGBColor : SV_Target; // Pixel color
};
PS_OUTPUT RenderScenePS( VS_OUTPUT In,
uniform bool bTexture )
{
PS_OUTPUT Output;
if( bTexture )
Output.RGBColor = g_MeshTexture.Sample(MeshTextureSampler, In.TextureUV) * In.Diffuse;
....
return Output;
}
효과 셰이더에 대한 구문은 효과 함수 구문(Direct3D 11)에서 자세히 설명합니다.
그룹, 기술 및 패스
그룹은 기술의 컬렉션입니다. 기술은 렌더링 패스의 컬렉션입니다(하나 이상의 패스가 있어야 합니다). 각 효과 패스(렌더링 루프의 단일 패스와 scope 유사)는 셰이더 상태 및 기하 도형을 렌더링하는 데 필요한 다른 파이프라인 상태를 정의합니다.
그룹은 선택 사항입니다. 모든 글로벌 기술을 포괄하는 명명되지 않은 단일 그룹이 있습니다. 다른 모든 그룹의 이름을 지정해야 합니다.
다음은 BasicHLSL10.fx의 한 가지 기술(한 패스 포함)의 예입니다.
technique10 RenderSceneWithTexture1Light
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, RenderSceneVS( 1, true, true ) ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, RenderScenePS( true ) ) );
}
}
fxgroup g0
{
technique11 RunComputeShader
{
pass P0
{
SetComputeShader( CompileShader( cs_5_0, CS() ) );
}
}
}
효과 셰이더에 대한 구문은 효과 기술 구문(Direct3D 11)에서 더 자세히 설명합니다.
관련 항목