Quick Flow
GL 4.0 지원 → patch 정점 수 지정 → GL_PATCHES draw
→ tessellation control: 출력 제어점·분할 레벨
→ 고정 분할기 → tessellation evaluation: 생성 위치 계산
→ 래스터화 또는 geometry 단계Tessellation은 메시를 자동으로 예쁘게 만드는 설정이 아니라, 분할 기준과 새 위치 계산을 함께 제공하는 단계입니다. 기본 3.3 예제에는 포함되지 않습니다.
Patch와 단계
// GL 4.0 Core: TCS·TES를 포함해 링크된 프로그램과 입력 VAO를 사용합니다.
glPatchParameteri(GL_PATCH_VERTICES, 3);
glDrawArrays(GL_PATCHES, 0, controlPointCount);controlPointCount는 정점 개수이며 patch 개수가 아닙니다. 제어점 세 개의 patch를 쓴다면 입력을 그 단위로 묶습니다. GL_PATCH_VERTICES의 기본값은 3이며 양수·구현 최대 이내여야 합니다.
TCS는 출력 patch 크기를 선언하고 gl_InvocationID를 기준으로 제어점을 다룹니다. TES는 triangles·quads·isolines 영역과 spacing·방향을 선언하고 gl_TessCoord로 생성 지점을 계산합니다. 입력 patch가 세 점이라고 모든 계산이 자동으로 평면 보간이 되는 것은 아닙니다.
분할 인벤토리
| 요소 | 역할 | 경계 |
|---|---|---|
| outer levels | 바깥 경계 분할 | 이웃 patch의 공유 경계 값 일치 |
| inner levels | 내부 분할 | 영역 타입에 따라 사용하는 성분이 다름 |
| spacing | equal_spacing·fractional_even_spacing·fractional_odd_spacing | 레벨 변화의 모습·정점 분포 |
| winding | cw·ccw | 이후 front face·cull 상태와 일치 |
| TCS 동기화 | 제어점 간 필요한 결과 공유 | 필요한 barrier와 실행 규칙 확인 |
TCS를 생략하는 구성에서는 API로 정한 기본 분할 레벨을 사용하는 경로가 있지만 TES와 유효한 patch 입력은 필요합니다. TCS가 활성화되면 그 셰이더가 써야 할 출력 레벨을 기본값이 대신 채워 준다고 가정하지 않습니다. TCS가 없는 경로의 기본 outer 레벨은 [1,1,1,1], inner 레벨은 [1,1]이며, glPatchParameterfv(GL_PATCH_DEFAULT_OUTER_LEVEL, outer)와 glPatchParameterfv(GL_PATCH_DEFAULT_INNER_LEVEL, inner)로 각각 float 배열을 전달합니다.
최소 삼각형 Patch
정점 셰이더가 위치를 gl_Position에 출력한 뒤, 다음 TCS는 제어점 세 개를 그대로 넘기고 모든 삼각형 변의 분할 레벨을 4로 정합니다. 각 invocation은 자신의 출력 제어점만 쓰며, 레벨은 invocation 0에서 씁니다.
#version 400 core
layout(vertices = 3) out;
void main() {
gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
if (gl_InvocationID == 0) {
gl_TessLevelOuter[0] = 4.0;
gl_TessLevelOuter[1] = 4.0;
gl_TessLevelOuter[2] = 4.0;
gl_TessLevelInner[0] = 4.0;
}
}같은 프로그램의 TES는 생성된 삼각형 영역 좌표로 세 위치를 보간합니다. 이 예제는 평면을 더 잘게 나누며, 곡면 변형은 별도 위치 함수가 필요합니다. 추가 색·UV가 필요하면 각 단계의 인터페이스도 함께 연결합니다.
#version 400 core
layout(triangles, equal_spacing, ccw) in;
void main() {
gl_Position = gl_TessCoord.x * gl_in[0].gl_Position
+ gl_TessCoord.y * gl_in[1].gl_Position
+ gl_TessCoord.z * gl_in[2].gl_Position;
}균열과 비용
이웃 patch가 같은 경계 위치·분할 정도를 다르게 계산하면 틈이 생길 수 있습니다. 카메라 거리 기반 적응 분할은 patch마다 제멋대로 계산하기보다 공유 경계에서 일치하는 규칙을 사용합니다. 최대 레벨을 넘겨 성능을 해결하려 하지 말고 생성 프리미티브 수와 화면상 필요 크기를 함께 고려합니다.
버전과 대안
4.0 코어 또는 해당 확장을 확인합니다. 3.3 대상은 CPU에서 분할한 메시나 다른 LOD 자산을 쓰는 대체 경로가 필요합니다. 구형 평가기·곡면 유틸리티와 목적이 비슷해도 API·실행 위치가 일대일 대응하지 않습니다. 곡면 수학 전체와 자산 제작은 범위 밖이며 단계 연결과 실패 조건에 집중합니다.
참고 링크
3 sources