이번에는 Geometry Processing의 두 번째 단계인 Tessellation에 대해 알아보자. Tessellation은 기본 도형인 프리미티브(Primitive)를 더 세분화하는 과정이다. 이 과정은 Tessellation Shader를 통해 프로그래머가 직접 작업할 수 있으며, LOD(Level of Detail)을 활용해 더 효율적인 렌더링을 구현할 수 있다.
렌더링을 진행하다 보면 굴곡진 부분이나 화면에 가까운 물체의 해상도를 높이고 싶을 때가 있다. 그러나 모든 물체의 해상도를 높이는 것은 성능 비용이 너무 크기 때문에 적합하지 않다. 이런 경우, 원하는 부분에만 프리미티브를 세분화하여 정점을 늘릴 수 있고, 이를 통해 특정 부분의 표현을 더 세밀하게 만들 수 있다.
Tessellation은 크게 세 단계로 이루어진다:
Hull Shader는 Tessellation 단계의 첫 번째 단계로, 프리미티브 단위로 처리하며 Tessellator에서 프리미티브를 얼마나 세분화할지 설정한다.
Hull Shader는 정점의 추가나 삭제는 불가능하지만, 정점의 위치를 변경할 수 있다. 만약 정점의 위치를 변경하면, 변경된 정점을 기준으로 세분화가 이루어진다.
Tessellator는 GPU에서 자동으로 Tessellation 레벨에 따라 실제로 프리미티브를 세분화하는 단계이다. 이 단계에서 새롭게 생성되는 정점의 좌표는 월드 좌표계가 아닌 기존 프리미티브 정점들의 상대적 위치로 만들어진다.
예를 들어, 프리미티브가 삼각형이라면 Tessellator는 생성된 정점의 위치를 보간 좌표(Barycentric Coordinates)로 표현한다:
Domain Shader는 Tessellator에서 생성된 정점별로 연산을 수행하는 단계이다. Tessellator가 전달한 보간 좌표를 기반으로 새로운 정점의 실제 좌표를 계산한다.
주요 작업:
// Domain Shader에서 Tessellator가 전달한 보간 좌표 (gl_TessCoord)를 사용
layout(triangles, fractional_even_spacing) in;
void main() {
// 보간 좌표 (u, v, w)
vec3 tessCoord = gl_TessCoord;
// 기존 제어점의 위치
vec3 p0 = gl_in[0].gl_Position.xyz;
vec3 p1 = gl_in[1].gl_Position.xyz;
vec3 p2 = gl_in[2].gl_Position.xyz;
// 보간 좌표를 사용하여 새로 생성된 정점의 위치 계산
vec3 newPosition = tessCoord.x * p0 + tessCoord.y * p1 + tessCoord.z * p2;
// 최종 위치를 출력
gl_Position = vec4(newPosition, 1.0);
}
layout(triangles, fractional_even_spacing) in;
void main() {
// Tessellator가 생성한 정점의 보간 좌표 (u, v, w)
vec3 tessCoord = gl_TessCoord;
// 기존 제어점의 위치 (원래 프리미티브의 정점)
vec3 p0 = gl_in[0].gl_Position.xyz;
vec3 p1 = gl_in[1].gl_Position.xyz;
vec3 p2 = gl_in[2].gl_Position.xyz;
// 보간 좌표를 사용하여 새로 생긴 정점의 위치 계산
vec3 newPosition = tessCoord.x * p0 + tessCoord.y * p1 + tessCoord.z * p2;
// 디스플레이스먼트 맵을 사용해 정점 위치 변형
float displacementValue = texture(displacementMap, texCoords).r;
newPosition += normal * displacementValue;
// 최종 위치를 출력
gl_Position = vec4(newPosition, 1.0);
}
Tessellation은 프리미티브를 세분화하여 곡면, 해상도, 디테일 표현 등을 조절할 수 있는 강력한 도구이다. 이를 적절히 활용하면 렌더링 성능과 디테일을 모두 잡을 수 있다. Geometry Processing 단계의 두 번째로, 원하는 디테일 수준에 맞게 정점을 세분화하고 추가적인 효과를 적용할 수 있는 중요한 과정이다.
Geometry Processing - Screen Mapping (0) | 2024.11.29 |
---|---|
Geometry Processing - Clipping (0) | 2024.11.29 |
Geometry Processing - Geometry Shading (1) | 2024.11.29 |
Geometry Processing - Vertex Shading (0) | 2024.11.29 |
Graphics Pipeline 개요 (0) | 2024.11.29 |