📒Tesellation
: Hull & Domain Shader
- DX11부터 추가된 pipeline 단계
- 정점을 추가해 폴리곤을 세분화하고 쪼갬

📌Setting
- Topology
- Vtx를 분석하는 위상
- Tesselation 전용 Topology 사용
D3D11_PRIMITIVE_TOPOLOGY_N_CONTROL_POINT_PATCHLISHT
- ex, N==3 이라면 제어점 3개짜리 patch list
- edge
- edge idx: idxed Vtx가 마주보는 변
- mesh: 대칭구조 필요
📌Control Point & Patch

[Control Point]
: 삼각형을 넘겨준다고 가정할 때, 각 정점에 해당하는 점
- 내부를 제어하는 점
- 제어점은 중간의 다른 정점을 생성하기 위한 기준점임
[Patch]
: 삼각형을 넘겨준다고 가정할 때, Control Point 세 개가 모인 set 자체
📒PipeLine
📌Tesellation Pipeline

[Vertex Shader]
: 원본 Vertex의 input - output
- Tesellation에서는 Domain Shader가 진짜 vertex 처리
- ex, 사각형 그리기위해 2개 삼각형 구성하는 상황) : 6개 output
[Hull Shader]
: 원본 Vertex를 n개씩 묶어 patch라는 하나의 조각으로 묶음
- n: 사용자가 설정, 대체로 3(삼각형) 사용
- ex, 사각형 그리기위해 2개 삼각형 구성하는 상황) : 2개 output
[Tesellation Stage]
: 추가적인 정점 생성함
- DX 내부적으로 수행, 직접 건드릴 수 없음
- patch constant function만 정의 가능
- patch constant function:
- 패치당 한 번씩 호출되는 함수
- 원하는 정점 개수 세팅
[Domian Shader]
: 새로 생긴 Vtx까지 포함해서, 모든 Vtx에 대해 호출 후 전처리
📌Tesellation vs Geometry
[(복습) Geometry Shader]
: 추가적인 분할 진행
: Tesellation과 Geometry 모두 정점을 분할하는 기능을 가지므로, 보통 함께 사용하진 않음
- 정점 대량 생산의 경우: Tesellation 활용
- 정점 소량 생산의 경우: Geometry Shader 활용
📒Hull Shader State
: 각 입력 패치(사각형, 삼각형 또는 선)에 해당하는 기하 도형 패치(및 패치 상수)를 생성하는 단계
- 각 패치(SV_PrimitiveID)에 대해 출력 제어점(SV_OutputControlPointID) 당 한 번 호출
📌HullShader 실행단계
: 크게 두 단계로 나뉨
- 제어점 단계
- 각 제어점에 대해 한 번 작동
- 패치를 위한 제어점을 읽고, 하나의 출력 제어점 생성
- 출력 제어점은 ControlPointID로 식별됨
- 패치 상수 단계
- 패치당 한 번씩 작동
- 가장자리 공간 분할 요인 및 기타 패치별 상수 생성
📌HullShader Func Define
[description]
: 컴파일에 필요한 description 필요
[paramater]
: 같이 소속된 patch의 정점들이 함께 들어옴
- InputPatch: patch의 원본 정점들 (VS return type)
- SV_OutputControlPointID: patch 내 호출된 idx
[TIP] Sementics
SV_Position은 rasterizer에서 사용하는 sementic이기 때문에, HS에선 사용 불가능함
📌patch constant function
: 어떻게 분할할지 설정하는 함수
- 실행: Tesselation Stage
- Hull Shader > Tesselation Stage > Domain Shader
- 패치 당 한 번씩 호출
[paramater]
- InputPatch: patch의 원본 정점들 (VS return type)
- SV_PrimitiveID: patch의 ID
[retun type]
: patch의 분할 레벨
- SV_TessFactor: edge당 control 갯수
- SV_InsideTessFactor: 내부 control 갯수
📒Tesselation State
: 더 세밀한 표현을 위해 공간 분할 요소를 사용하여 각 패치를 세분화하는 단계
📒Domain Shader
: 원본 정점 포함 모든 정점에 대해 호출해 세분화된 위치 계산하는 단계
📌보간
: 보간된 값이 들어오지 않고, 대신 가중치값이 들어오므로 직접 보간해서 값 구해야 함

- 원본 정점: 패치의 원본 정점 먼저 들어옴
- 가중치: 보간된 값이 아닌, 원본 정점에 대한 가중치 값이 들어옴
(복습) Pixel Shader
: 호출된 픽셀의 값이 알아서 보간되어 들어왔음
📌DomainShader Func Define
[description]
: 컴파일에 필요한 description 필요
- domain : 들어오는 단위
- ex, 3개 정점을 가진 삼각형을 단위로 들어옴 명시
[paramater]
- patch Level: HullShader에서 설계한 각 패치의 분할 레벨
- OutputPach : 원본 정점들
- SV_DomainLocation : 해당 Vtx에서 사용할 가중치
📒Tesellation의 이점
📌성능 개선
- GPU를 통해 low-detail subdivision surface를 high-detail subdivision surface로 변환
- CPU에서 high-resolution 모델을 올리는 방식: 엄청난 부하 발생
📌Displacement Mapping
- nomal mapping: 근본적으로 geometry를 조작하지 못함
- tesellation: surfaces를 쪼개 만든 정점의 위치를 조작할 수 있음

References
[1] Hull Shader MS Doc: https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/hull-shader-stage--hs-
[2] Domain Shader MS Doc: https://learn.microsoft.com/en-us/windows/uwp/graphics-concepts/domain-shader-stage--ds-
[3] Tessellation: https://develop-4-art.tistory.com/11
[4] Tessellation: https://song-ift.tistory.com/450