1. 개요

헐 셰이더(HS)는 그래픽스 파이프라인에서 테셀레이션 스테이지의 첫 번째 단계이다. 정점 셰이더(VS) 다음에 실행되며, 프로그래밍이 가능한 스테이지이다.
HS의 핵심 목적은 입력 조립기(IA)에서 넘어온 저해상도 기본 도형(이를 패치(Patch)라고 부름)을 입력받아, 이 패치를 얼마나 잘게 쪼갤 것인지 결정하는 것이다.
이 결정은 주로 카메라와의 거리(LOD) 같은 요소를 기반으로 실시간으로 이루어진다.

2. 헐 셰이더의 2가지 핵심 기능
헐 셰이더는 실제로 두 개의 개별 프로그램이 함께 동작하는 구조이다.
2.1. 제어점 셰이더 (Control Point Shader)
- 실행: 패치(Patch)를 구성하는 각 제어점(Control Point)마다 한 번씩 실행된다. (VS와 유사함)
- 역할:
- VS로부터 입력받은 제어점 데이터를 읽는다.
- 이 데이터를 다음 단계인 도메인 셰이더(Domain Shader)가 사용할 수 있도록 가공하거나 그대로 전달한다. (예: 제어점의 위치, UV 좌표 등)
2.2. 패치 상수 함수 (Patch Constant Function)
- 실행: 패치(Patch) 당 한 번만 실행된다.
- 역할 (핵심):
- 테셀레이션 팩터(Tessellation Factors)를 계산한다. 이 값은 "패치의 각 가장자리를 몇 조각으로 쪼갤지", "패치의 내부는 몇 조각으로 쪼갤지"를 정의하는 숫자(명령)이다.
- 예를 들어, 카메라가 가까우면 EdgeTessFactor[0] = 10.0 (10조각), 멀면 EdgeTessFactor[0] = 1.0 (쪼개지 않음) 같은 값을 계산한다.
3. 입력과 출력
3.1. 입력 (Input)
- From VS: 정점 셰이더를 통과한 제어점(Control Points)의 집합.
- (IA에서 D3D_PRIMITIVE_TOPOLOGY_..._CONTROL_POINT_PATCHLIST로 토폴로지를 설정해야 함)
3.2. 출력 (Output)
- To Tessellator (테셀레이터):
- Patch Constant Data
- Tessellation Factors
- Edge Factors: 패치의 각 바깥쪽 가장자리를 몇 조각으로 나눌지 지정. (예: 삼각형 패치는 3개의 Edge Factor를 가짐)
- Inside Factors: 패치의 내부를 몇 조각으로 나눌지 지정. (예: 삼각형은 1개, 사각형은 2개의 Inside Factor를 가짐)
- Tessellator State: 어떤 방식으로 쪼갤 것인가?에 대한 설정
- Partitioning (분할 방식): 쪼개는 알고리즘을 지정한다. (예: integer, fractional_odd, fractional_even 등... 정수/홀수/짝수 단위로 나눌지)
- Domain (도메인): 입력 패치의 기본 형태를 지정한다. (예: triangle (삼각형), quad (사각형), isoline (선))
- Tessellation Factors
- Patch Constant Data
- To Domain Shader (도메인 셰이더):
- 페치 제어점 (Patch Control Points): 새롭게 생성될 정점들의 위치를 계산(보간)하기 위한 원본 데이터.
4. 테셀레이션 사용 시 VS가 좌표 변환을 멈추는 이유
테셀레이션 파이프라인을 활성화할 때 기존의 정점 셰이더(VS)가 최종 좌표 변환(Space Change)을 수행하지 않는 것은,
핵심 이유는 *래스터라이저(RS)로 넘어갈 '최종 정점'이 VS 실행 시점에는 아직 존재하지 않기 때문이다.
1. '최종 정점'의 생성 시점 비교
파이프라인의 래스터라이저(RS) 스테이지는 화면에 픽셀을 그리기 위해 반드시 각 정점의 최종 클립 공간 좌표(SV_Position)를 알아야 한다. 이 SV_Position을 계산하는 책임이 누구에게 있는지가 핵심이다.
1.1. 테셀레이션 OFF (기본 상태)
- 흐름: IA ➔ VS ➔ RS
- 역할:
- 입력 조립기(IA)가 모델의 '최종 정점'을 VS에게 전달한다.
- VS는 RS로 데이터를 보내기 직전의 마지막 셰이더 단계로 SV_Position을 계산한다.
1.2. 테셀레이션 ON (활성 상태)
- 흐름: IA ➔ VS ➔ HS ➔ T ➔ DS*➔ RS
- 역할:
- IA가 VS에게 전달하는 것은 '최종 정점'이 아닌, 쪼개기 전의 '원본 제어점(Control Point)' (즉, 패치)이다.
- HS(헐 셰이더)와 T(테셀레이터)가 이 패치를 기반으로 수백 개의 '새로운 중간 정점'을 생성한다.
- DS(도메인 셰이더)가 이 '새로운 중간 정점'들을 입력받아, 보간 및 디스플레이스먼트 매핑(Displacement)을 적용하여 비로소 '최종 3D 위치'를 계산한다.
- DS는 RS로 데이터를 보내기 직전의 마지막 셰이더 단계가 된다.
- 따라서 RS가 필요로 하는 SV_Position을 계산할 책임은 DS에게 있다.
2. 결론
- VS (역할 축소): VS의 역할은 '최종 좌표 변환'에서 '원본 제어점 전처리'로 축소된다. VS는 헐 셰이더가 사용할 제어점 데이터를 준비하여 넘겨주는 역할만 한다.
- DS (역할 확대): DS는 테셀레이션의 고유 임무(새 정점의 3D 위치 계산)와 더불어, VS의 기존 역할인 최종 클립 공간 좌표 계산까지 모두 담당한다.
5. 요약
저해상도 패치를 입력받아, 이 패치를 얼마나 정교하게 만들지(LOD)를 결정하는 테셀레이션 팩터를 생성하고, 원본 제어점 데이터를 다음 단계(도메인 셰이더)로 전달하는 책임을 진다.
6. 참고
https://learn.microsoft.com/ko-kr/windows/uwp/graphics-concepts/hull-shader-stage--hs-
HS(헐 셰이더) 단계 - UWP applications
HS(헐 셰이더) 단계는 공간 분할 단계 중 하나로, 모델의 한 표면을 효율적으로 많은 삼각형으로 나눕니다.
learn.microsoft.com
'그래픽스' 카테고리의 다른 글
| 06. Geometry Shader (0) | 2025.11.04 |
|---|---|
| 05. Domain Shader (0) | 2025.11.04 |
| 04. Tessellator (0) | 2025.11.04 |
| 02. Vertex Shader (0) | 2025.11.04 |
| 01. Input Assembler (0) | 2025.11.04 |