테셀레이션은 우리가 만든 매쉬의 정점을 잘게 쪼개 더 정밀한 매쉬를 만들어내는 과정이다. 단계는 Hull Shader, Tessellation, Domain Shader 로 구성되어 있다.

Constant hull Shader는 패치마다 실행되는 쉐이더 함수로서 테셀레이셔에서 패치를 얼마나 세분화 할것인지 결정한다.
struct PatchLevel
{
float arrEdge[3] : SV_TessFactor;
float Inside : SV_InsideTessFactor;
};
PatchLevel PatchConstFunc(InputPatch<VS_OUT, 3> _in, uint patchID : SV_PrimitiveID )
{
PatchLevel output = (PatchLevel) 0.f;
output.arrEdge[0] = g_vec4_0.x;
output.arrEdge[1] = g_vec4_0.y;
output.arrEdge[2] = g_vec4_0.z;
output.Inside = g_vec4_0.w;
return output;
}
모든 제어점에 대해 한번씩 호출되는 쉐이더이다. 입력으로 패치와 호출된 제어점의 인덱스가 들어오기 때문에, SV_OutputControlPointID를 통해 인덱스 접근으로 현재 호출된 제어점을 알수 있다.
원한다면 제어점을 증가시키거나, 변환도 가능하다.
[patchconstantfunc("PatchConstFunc")]
[outputtopology("triangle_cw")]
[domain("tri")]
[maxtessfactor(64)]
[partitioning("integer")]
[outputcontrolpoints(3)]
HS_OUT HS_Tess(InputPatch<VS_OUT, 3> _in, uint _idx : SV_OutputControlPointID)
{
HS_OUT output = (HS_OUT) 0.f;
output.vPos = _in[_idx].vPos;
output.vUV = _in[_idx].vUV;
return output;
}
: 각 패치를 세분화 하는 단계
