
개발자가 쉐이더 코드로 제어 가능한 영역입니다.
Hull Shader, Domain Shader는 프로그래머블하지만, 중간의 Tessellator는 하드웨어 고정 기능입니다.
개발자는 '얼마나 쪼갤지'를 코드로 제어할 수 있습니다.
개요
이 단계는 "디테일을 추가하는 단계"입니다.
거친(Low Poly) 모델을 입력받아, GPU가 실시간으로 폴리곤을 잘게 쪼개어(Subdivide) 아주 매끄러운 곡면이나 울퉁불퉁한 표면을 만들어냅니다.
주로 가까이 있는 물체에 극강의 디테일을 부여할 때 사용하지만, 잘못 사용하면 폴리곤 수가 폭발하여 GPU를 마비시킬 수 있습니다.
<핵심 목표>
- Polygon Management : 화면에 필요한 만큼만 적절하게 폴리곤을 늘립니다.
- Alternative Tech : 무거운 테셀레이션 대신 가벼운 눈속임 기술(Texture Mapping)로 대체합니다.
최적화 방법
1. Distance-based Adaptive Tessellation (거리 기반 적응형 테셀레이션)
- 설명 : 테셀레이션을 켜더라도 모든 물체에 동일하게 적용하지 않고, 카메라와의 거리에 따라 테셀레이션 레벨(Tessellation Factor)을 조절하는 쉐이더 로직을 구현합니다.
- Near : 많이 쪼개서 부드럽게 표현.
- Far : 덜 쪼개거나 아예 끔(Level 1).
- 이후 단계에서 효과 :
- Stage 5 (Rasterization) : 화면에서 아주 작게 보이는 물체가 수천 개의 삼각형으로 쪼개지는 낭비(Micro-triangle problem)를 막아, 래스터라이저의 과부하를 방지합니다.
- 장점 :
- 시각적 품질 유지 : 플레이어 눈앞에 있는 물체의 디테일은 살리면서 전체적인 성능을 방어할 수 있습니다.
- 단점 :
- 구현 난이도 : 거리 계산 및 레벨 조절 로직을 쉐이더에 직접 짜 넣어야 합니다.
- Popping 현상 : 거리에 따라 디테일이 변할 때 물체 표면이 꿀렁거리는 아티팩트가 보일 수 있습니다.
2. 맵 베이킹을 통한 대체
- 설명 : 성능 최적화가 1순위인 프로젝트(특히 모바일)에서는 테셀레이션 단계를 아예 비활성화(Disable)합니다. 대신, 디테일 표현을 6단계(Pixel Shader)로 넘깁니다.
- Normal Map / Parallax Map : 지오메트리를 실제로 쪼개는 대신, 텍스처를 이용해 빛 반사만 조작하여 굴곡이 있는 것처럼 착시를 일으킵니다.
- 지금 및 이후 단계에서 효과 :
- Stage 3 (Tess) : 무거운 연산 단계를 건너뜁니다 (지금 단계).
- Stage 5 (RS) : 처리할 폴리곤 수가 늘어나지 않습니다 (이후 단계).
- 장점 :
- 확실한 성능 확보 : 최신 게임에서도 바닥, 벽 등 배경에는 실제 테셀레이션보다 이 방식을 훨씬 많이 사용합니다. 가성비가 가장 좋습니다.
- 단점 :
- 실루엣의 한계 : 픽셀 쉐이더에서의 눈속임이므로, 물체 표면 안쪽은 입체적이어도 외곽선(실루엣)은 여전히 평평하게(Low Poly) 보입니다.
- ※ 헷갈리기 쉬운 포인트 : Displacement Map vs Normal Map
- Displacement Map (테셀레이션 사용) : 실제 버텍스 위치를 옮김. 실루엣도 울퉁불퉁해짐. (무거움)
- Normal Map (픽셀 쉐이더 사용) : 빛 반사 방향만 속임. 실루엣은 평평함. (가벼움)