방법: 도메인 셰이더 디자인
도메인 셰이더는 테 셀레이션을 구현하기 위해 함께 작동하는 세 단계 중 세 번째 단계입니다. 도메인 셰이더는 헐 셰이더 및 UV 좌표에서 변환된 제어점에서 표면 기하 도형을 생성합니다. 이 topics 도메인 셰이더를 디자인하는 방법을 보여줍니다.
고정 함수 테셀레이터에서 생성된 각 지점에 대해 도메인 셰이더가 한 번 호출됩니다. 입력은 패치 지점의 UV[W] 좌표뿐만 아니라 제어점 및 패치 상수를 포함한 헐 셰이더의 모든 출력 데이터입니다. 출력은 원하는 방식으로 정의된 꼭짓점입니다. 출력이 픽셀 셰이더로 전송되는 경우 출력에는 위치(SV_Position 의미 체계로 표시됨)가 포함되어야 합니다.
도메인 셰이더를 디자인하려면
도메인 특성을 정의합니다.
[domain("quad")]
도메인은 쿼드 패치에 대해 정의됩니다.
도메인 위치 시스템 값을 사용하여 헐의 위치를 선언합니다.
- 쿼드 패치의 경우 float2를 사용합니다.
- 트라이 패치의 경우 float3(바리센트릭 좌표용)을 사용합니다.
- 이소라인의 경우 float2를 사용합니다.
따라서 쿼드 패치의 도메인 위치는 다음과 같습니다.
float2 UV : SV_DomainLocation
다른 입력을 정의합니다.
다른 입력은 헐 셰이더에서 제공되며 사용자가 정의합니다. 여기에는 패치에 대한 입력 제어 지점이 포함되며, 그 중 1~32포인트가 있을 수 있으며 입력 패치 상수 데이터가 포함됩니다.
제어점은 일반적으로 다음과 같은 구조로 사용자 정의됩니다( 방법: 헐 셰이더 디자인에 정의됨).
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
패치 상수 데이터도 사용자 정의이며 다음과 같이 표시될 수 있습니다( 방법: 헐 셰이더 디자인에 정의됨).
HS_CONSTANT_DATA_OUTPUT input
사용자 정의 코드를 추가하여 출력을 계산합니다. 도메인 셰이더의 본문을 구성합니다.
이 구조에는 사용자 정의 도메인 셰이더 출력이 포함됩니다.
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 .
도메인 셰이더를 디자인한 후 방법: 도메인 셰이더 만들기를 참조하세요.
관련 항목