다음을 통해 공유


효과의 상태 구성(Direct3D 10)

Direct3D 10을 사용하면 특정 파이프라인 단계에 대한 효과 상태가 다음 구조로 구성됩니다.

파이프라인 상태 구조체
입력 어셈블러 D3D10_INPUT_ELEMENT_DESC
래스터화 D3D10_RASTERIZER_DESC
출력 병합기 D3D10_BLEND_DESCD3D10_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 10)에 자세히 설명되어 있습니다. 효과 텍스처 샘플러에 대한 구문은 샘플러 유형(DirectX HLSL)에 자세히 설명되어 있습니다.

셰이더

셰이더는 작은 실행 프로그램입니다. HLSL 코드는 셰이더 기능을 구현하므로 셰이더를 셰이더 상태를 캡슐화하는 것으로 간주할 수 있습니다. 파이프라인은 세 가지 종류의 셰이더를 사용합니다.

  • 꼭짓점 셰이더 - 꼭짓점 데이터에서 작동합니다. 의 꼭짓점 하나가 하나의 꼭짓점을 생성합니다.
  • 기하 도형 셰이더 - 기본 데이터에서 작동합니다. 의 한 기본 형식은 0, 1 또는 많은 기본 형식을 생성할 수 있습니다.
  • 픽셀 셰이더 - 픽셀 데이터에서 작동합니다. 의 1픽셀은 1픽셀 출력을 생성합니다(렌더링에서 픽셀이 컬링되지 않는 한).

셰이더는 로컬 함수이며 C 스타일 함수 규칙을 따릅니다. 효과가 컴파일되면 각 셰이더가 컴파일되고 각 셰이더 함수에 대한 포인터가 내부적으로 저장됩니다. 컴파일에 성공하면 ID3D10Effect 인터페이스가 반환됩니다. 이 시점에서 컴파일된 효과는 중간 형식입니다.

컴파일된 셰이더에 대한 자세한 내용을 확인하려면 셰이더 리플렉션을 사용해야 합니다. 이는 기본적으로 런타임에 셰이더를 디컴파일하고 셰이더 코드에 대한 정보를 다시 반환하도록 요청하는 것과 같습니다.

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 10)에 자세히 설명되어 있습니다.

기술 및 패스

기술은 렌더링 패스의 컬렉션입니다(패스가 하나 이상 있어야 합니다). 각 효과 패스(렌더링 루프의 단일 패스와 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 ) ) );
    }
}

효과 셰이더에 대한 구문은 효과 기술 구문(Direct3D 10)에 자세히 설명되어 있습니다.

효과(Direct3D 10)