다음을 통해 공유


방법: 도메인 셰이더 디자인

도메인 셰이더는 테 셀레이션을 구현하기 위해 함께 작동하는 세 단계 중 세 번째 단계입니다. 도메인 셰이더는 헐 셰이더 및 UV 좌표에서 변환된 제어점에서 표면 기하 도형을 생성합니다. 이 topics 도메인 셰이더를 디자인하는 방법을 보여줍니다.

고정 함수 테셀레이터에서 생성된 각 지점에 대해 도메인 셰이더가 한 번 호출됩니다. 입력은 패치 지점의 UV[W] 좌표뿐만 아니라 제어점 및 패치 상수를 포함한 헐 셰이더의 모든 출력 데이터입니다. 출력은 원하는 방식으로 정의된 꼭짓점입니다. 출력이 픽셀 셰이더로 전송되는 경우 출력에는 위치(SV_Position 의미 체계로 표시됨)가 포함되어야 합니다.

도메인 셰이더를 디자인하려면

  1. 도메인 특성을 정의합니다.

    [domain("quad")]
    

    도메인은 쿼드 패치에 대해 정의됩니다.

  2. 도메인 위치 시스템 값을 사용하여 헐의 위치를 선언합니다.

    • 쿼드 패치의 경우 float2를 사용합니다.
    • 트라이 패치의 경우 float3(바리센트릭 좌표용)을 사용합니다.
    • 이소라인의 경우 float2를 사용합니다.

    따라서 쿼드 패치의 도메인 위치는 다음과 같습니다.

    float2 UV : SV_DomainLocation
    
  3. 다른 입력을 정의합니다.

    다른 입력은 헐 셰이더에서 제공되며 사용자가 정의합니다. 여기에는 패치에 대한 입력 제어 지점이 포함되며, 그 중 1~32포인트가 있을 수 있으며 입력 패치 상수 데이터가 포함됩니다.

    제어점은 일반적으로 다음과 같은 구조로 사용자 정의됩니다( 방법: 헐 셰이더 디자인에 정의됨).

    const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
    

    패치 상수 데이터도 사용자 정의이며 다음과 같이 표시될 수 있습니다( 방법: 헐 셰이더 디자인에 정의됨).

    HS_CONSTANT_DATA_OUTPUT input
    
  4. 사용자 정의 코드를 추가하여 출력을 계산합니다. 도메인 셰이더의 본문을 구성합니다.

    이 구조에는 사용자 정의 도메인 셰이더 출력이 포함됩니다.

    struct DS_OUTPUT
    {
        float3 vNormal    : NORMAL;
        float2 vUV        : TEXCOORD;
        float3 vTangent   : TANGENT;
        float3 vBiTangent : BITANGENT;
    
        float4 vPosition  : SV_POSITION;
    };
    

    함수는 각 입력 UV(테셀레이터에서)를 가져와 이 위치에서 Bezier 패치를 평가합니다.

    [domain("quad")]
    DS_OUTPUT BezierEvalDS( HS_CONSTANT_DATA_OUTPUT input, 
                            float2 UV : SV_DomainLocation,
                            const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch )
    {
        DS_OUTPUT Output;
    
        // Insert code to compute the output here.
    
        return Output;    
    }
    

    함수는 고정 함수 테셀레이터에 의해 생성된 각 지점에 대해 한 번 호출됩니다. 이 예제에서는 쿼드 패치를 사용하므로 입력 도메인 위치(SV_DomainLocation)는 float2(UV)입니다. tri 패치에는 float3 입력 위치(UVW 바리센트릭 좌표)가 있고, 이소라인에는 float2 입력 도메인 위치가 있습니다.

    함수에 대한 다른 입력은 헐 셰이더에서 직접 가져옵니다. 이 예제에서는 각각 BEZIER_CONTROL_POINT 16개의 제어점과 패치 상수 데이터(HS_CONSTANT_DATA_OUTPUT)입니다. 출력은 원하는 데이터를 포함하는 꼭짓점입니다. 이 예제에서는 DS_OUTPUT .

도메인 셰이더를 디자인한 후 방법: 도메인 셰이더 만들기를 참조하세요.

Direct3D 11을 사용하는 방법

테셀레이션 개요