
하드웨어가 알아서 수행하는 영역입니다.
이 단계의 로직을 직접 수정할 수는 없습니다.
하지만 API 설정(Cull Mode)이나 그리는 순서(Sorting)를 조절하여 하드웨어가 더 잘 작동하게 도울 수 있습니다.
개요
이 단계는 "도형을 픽셀로 변환하는 단계"입니다.
2단계(VS)에서 변환된 3D 삼각형이 화면의 어느 픽셀(Pixel)을 덮는지 계산하고, 실제로 그릴 필요가 없는 픽셀을 최종적으로 걸러내는(Culling) 작업을 수행합니다.
여기서 잘 걸러내야, 가장 비싼 6단계(Pixel Shader)가 헛일(Overdraw)을 안 하게 됩니다.
<핵심 목표>
- Culling Efficiency : 뒷면이거나, 다른 물체에 가려진 픽셀을 최대한 빨리 찾아내어 버립니다.
- Prevent Overdraw : 한 픽셀을 여러 번 칠하는 낭비를 막습니다.
최적화 방법
1. Backface Culling (백페이스 컬링)
- 설명 : 카메라를 등지고 있는 면(뒷면)은 어차피 화면에 보이지 않으므로 렌더링 파이프라인에서 즉시 제거하는 기법입니다. (삼각형의 나열 순서(Winding Order)를 통해 앞/뒤를 판단합니다.)
- 이후 단계에서 효과 :
- Stage 6 (Pixel Shader) : 픽셀 쉐이더가 실행되어야 할 횟수를 이론상 절반(50%)으로 줄여줍니다.
- 장점 :
- 공짜 성능 향상 : 하드웨어 기본 기능이므로 추가 비용 없이 엄청난 최적화 효과를 얻습니다. (대부분 기본값으로 켜져 있음)
- 단점 :
- 양면 렌더링 불가 : 망토, 나뭇잎, 펄럭이는 깃발처럼 앞뒤가 모두 보여야 하는 물체는 이 기능을 꺼야(Cull Off) 하므로 성능 비용이 2배로 늘어납니다.
- ※ 헷갈리기 쉬운 포인트 : Backface Culling(5단계) vs Frustum Culling(0단계)
- Backface Culling : "화면 안에는 있는데 뒤를 돌고 있어서 안 그림." (삼각형 단위)
- Frustum Culling : "아예 화면 밖에 있어서 안 보냄." (물체 단위)
2. Early-Z (Early Depth Test)
- 설명 : 원래 깊이 테스트(Depth Test)는 픽셀 쉐이더가 끝난 후에 하는 것이 정석입니다. 하지만 최신 GPU는 최적화를 위해, 픽셀 쉐이더를 실행하기 '전에' 미리 깊이(Depth)를 확인합니다. 만약 현재 찍으려는 픽셀이 이미 그려진 픽셀보다 뒤에 있다면, 굳이 색을 계산할 필요 없이 즉시 폐기(Skip)합니다.
- 이후 단계에 효과 :
- Stage 6 (Pixel Shader) : 벽 뒤에 가려진 물체들의 픽셀 쉐이더 연산을 아예 수행하지 않으므로, 오버드로우(Overdraw)를 획기적으로 방지합니다.
- 장점 :
- 복잡한 씬 최적화 : 물체가 겹겹이 쌓여 있는 환경(도시, 실내)에서 성능을 지켜주는 일등 공신입니다.
- 단점 :
- 조건부 작동 : 픽셀 쉐이더에서 '알파 테스트(discard)'를 하거나 '깊이 값을 수정'하는 코드가 있으면, GPU는 미리 예측할 수 없어서 Early-Z 기능을 강제로 꺼버립니다. (성능 급락의 원인)
- ※ 헷갈리기 쉬운 포인트 : Early-Z를 돕기 위한 개발자의 역할(7단계 연계)
- Early-Z는 "앞에 있는 걸 먼저 그려야" 작동합니다.
- 따라서 0단계(CPU)나 7단계(OM) 설정을 통해 불투명 물체는 반드시 '앞에서 뒤로(Front-to-Back)' 순서로 정렬해서 그려야 이 기능이 100% 발휘됩니다.(반대로 투명 물체는 뒤에서 앞으로 그려야 색이 알맞게 섞임.)