핵심 정리
| 개념 | 의미 |
|---|---|
| Depth buffer | 픽셀별 가장 가까운 깊이 저장 |
| Depth test | 새 fragment가 더 가까운지 비교 |
| Depth write | 통과한 깊이를 버퍼에 기록 |
| Z-fighting | 거의 같은 깊이가 번갈아 선택되는 현상 |
| Near/Far | projection의 깊이 범위와 정밀도에 영향 |
구조
깊이 버퍼는 화면 각 위치에서 지금까지 가장 가까웠던 fragment의 깊이를 저장합니다. 새 fragment가 들어오면 기존 깊이와 비교하고, 더 가까우면 색과 깊이를 갱신합니다.
if newDepth < storedDepth:
color = fragmentColor
storedDepth = newDepth이 과정 덕분에 뒤에 있는 물체를 먼저 그려도 앞 물체가 최종적으로 보일 수 있습니다.
Z-fighting
z-fighting은 두 표면의 깊이가 너무 가까워서 depth buffer가 어느 쪽이 앞인지 안정적으로 구분하지 못할 때 발생합니다. 멀리 있는 평면, 겹친 decal, 너무 넓은 near/far 범위에서 자주 보입니다.
해결 기준
| 상황 | 대응 |
|---|---|
| near plane이 너무 작음 | near를 가능한 멀리 둠 |
| far plane이 너무 큼 | far를 필요한 범위로 줄임 |
| 표면이 겹침 | geometry offset 또는 decal 방식 변경 |
| 멀리서 깜빡임 | depth precision 재검토 |
| 투명 물체 | depth write와 정렬 정책 분리 |
depth precision은 선형으로 고르게 분포하지 않는 경우가 많습니다. 일반적인 perspective projection에서는 near plane 근처 정밀도가 높고 멀수록 정밀도가 떨어집니다.
주의할 점
z-fighting을 단순히 표면을 아주 조금 띄워 해결하면 카메라 거리나 스케일이 바뀔 때 다시 깨질 수 있습니다. projection near/far, depth format, 렌더링 순서, decal 기법을 함께 봐야 합니다.
투명 물체는 depth test와 depth write 정책이 불투명 물체와 다릅니다. 투명도를 쓰면 깊이 문제와 정렬 문제가 같이 생길 수 있습니다.
참고 링크
1 sources