- 개요
다수의 게임 오브젝트를 그리는 경우 카메라에서 멀리 떨어진 게임 오브젝트를 먼저 그리고
가까운 오브젝트를 다음에 그리도록 순서를 조절해야 원근감을 올바르게 표현할 수 있다
하지만 같은 거리에 있는 두 개의 게임 오브젝트가 겹친다면
물체 단위로 그리는 순서를 조절하는 것으로는 문제를 해결할 수 없다
- 깊이 버퍼와 깊이 테스팅

위와 같은 문제를 해결하기 위한 방법은 게임 오브젝트의 단위가 아닌
삼각형의 픽셀 단위로 깊이를 비교하고 가까운 곳에 있는 픽셀만 그리는 것이다
이를 구현하기 위해 화면의 픽셀마다 현재의 깊이 값을 보관할 별도의 공간이 필요한데,
이를 깊이 버퍼라고 표현한다

최종 픽셀을 찍는 과정에서 현재 깊이 값을 깊이 버퍼에 저장된 값과 비교하여
현재 깊이 값이 작은 경우에만 픽셀을 찍도록 로직을 구성하면
그리기 순서 문제를 해결하면서 물체에 가려져 그리지 않아도 되는 픽셀을 생략할 수 있다
위와 같은 작업을 깊이 테스팅이라고 표현한다
- 깊이 버퍼를 활용한 원근감 표현

깊이 테스팅은 깊이 값의 대소만 비교하면 되므로 NDC의 Z축에 저장된 깊이 값을 그대로 사용한다
삼각형을 구성하는 세 점의 깊이 값 z1, z2, z3로부터 계산된 각 픽셀의 무게중심좌표 q1, q2, q3를 사용하여
픽셀의 깊이 값 z`를 구하는 수식은 위와 같다
해당 수식을 사용하여 랜덤하게 생성된 다수의 게임 오브젝트를 깊이 테스팅 기법을 적용하여
카메라의 거리에 따라 올바르게 보이도록 설정한다
1) 랜덤한 위치의 100개의 게임 오브젝트를 생성

씬을 로드하는 LoadScene3D 함수에 위와 같이 로직을 추가한다
고정 시드를 통해 랜덤값을 생성하도록 설정한다
distZ 함수를 통해 [-1500, 0]의 범위의 Z 값을 생성하고,
distXY 함수를 통해 [-1000, 1000]의 범위의 X / Y값을 생성한다
이후 각각의 함수를 사용하여 게임 오브젝트의 위치를 지정한다

Update3D 함수에 위와 같이 로직을 추가하여 스페이스바 키를 눌러 깊이 테스팅 수행 여부를 지정할 수 있다
2) 깊이 테스팅의 수행

메시를 구성하는 삼각형을 그리는 DrawTriangle3D 함수에 위와 같이 로직을 추가한다
깊이 테스팅을 수행한다면 위의 식을 활용하여 픽셀의 깊이 값을 계산하고 newDepth 지역변수에 저장한다
이후, 깊이 버퍼에서 해당 픽셀 위치에 대응하는 깊이 값을 가져오고 prevDepth 지역변수에 저장한다
깊이 값은 카메라에서 멀어질수록 커지므로 두 개의 지역변수를 비교하여 다음과 같이 진행한다
- prevDepth의 값이 큰 경우 : newDepth 변수의 값을 깊이 버퍼에 저장
- newDepth의 값이 큰 경우 : 더 멀리 떨어진 픽셀이므로 해당 픽셀의 그리기를 건너뜀
- 최종 실행 결과


'수학 > 이득우의 게임 수학' 카테고리의 다른 글
| 원근 투영 (7) 깊이 버퍼의 시각화 (2) (0) | 2026.06.17 |
|---|---|
| 원근 투영 (6) 깊이 버퍼의 시각화 (1) (0) | 2026.06.17 |
| 원근 투영 (4) - 원근 보정 매핑 (0) | 2026.06.10 |
| 원근 투영 (3) - 깊이 값 (0) | 2026.06.03 |
| 원근 투영 (2) - 동차 좌표계 (0) | 2026.05.27 |