Z-버퍼(Z-buffer)는 깊이 버퍼(depth buffer)라고도 불리며, 컴퓨터 그래픽스에서 은면 제거(hidden surface removal), 즉 화면에 보이지 않는 면을 검출하고 제거하는 데 사용되는 대표적인 기법입니다.
은면 제거(Hidden Surface Detection)란?
여러 개의 물체와 표면으로 구성된 장면에서는 어떤 물체가 다른 물체 뒤에 가려져 보이지 않는 경우가 발생합니다. 이미지를 올바르게 시각화하려면 이렇게 가려진 면들을 찾아내 제거하는 과정이 반드시 필요합니다. 이러한 문제를 은면 문제(hidden surface problem)라고 부릅니다.
Z-버퍼 방법에서는 z축 방향의 깊이 값을 기준으로 각 표면을 서로 비교하여, 관찰자에게 가장 가까운 표면만을 화면에 그립니다.
Z-버퍼 알고리즘
1단계: 모든 픽셀의 깊이 값을 최댓값으로 초기화한다.
d(i, j) = 무한대(infinity)
2단계: 모든 픽셀의 색상을 초기화한다.
c(i, j) = 배경색(background-color)
3단계: 다각형(polygon) 투영 영역의 각 픽셀에 대해 반복한다.
3.1단계: 투영된 (i, j) 픽셀의 깊이 z를 계산한다.
3.2단계: 만약 z < d(i, j)라면
3.2.1단계: d(i, j) = z 로 갱신하고,
c(i, j) = 해당 다각형의 색상으로 설정한다.
이 알고리즘을 픽셀 단위로 적용하면 평면 위 모든 픽셀의 깊이를 구할 수 있습니다. 최종적으로 가장 작은 깊이 값을 가진 표면이 버퍼의 색상을 결정하게 됩니다. 일반적으로 모든 z 값은 [0, 1] 범위 내의 값으로 정규화됩니다.
- z = 0: 후방 클리핑 평면(back clipping plane)
- z = 1: 전방 클리핑 평면(front clipping plane)
Z-버퍼 방법의 주요 특징
장점
- 다각형(평면)에 대한 사전 정렬 없이 바로 적용할 수 있습니다.
- 평면의 개수가 많더라도 빠른 처리 속도를 제공합니다.
- 객체 간 복잡한 비교 연산이 필요하지 않습니다.
- 다각형이 아닌 형태의 은면 객체도 검출할 수 있습니다.
- 저장 및 처리를 위한 별도의 자료 구조가 필요 없습니다.
- 하드웨어로 구현하여 속도를 크게 향상시킬 수 있으며, 실제로 그래픽 워크스테이션과 GPU에서 널리 활용되고 있습니다.
단점
- 대상 객체가 불투명(opaque)한 경우에만 적용 가능하며, 투명한 객체를 처리할 때는 오류가 발생할 수 있습니다.
- 가려진 면까지 계산 과정에서 그리기를 수행하므로, 경우에 따라 처리 시간이 오래 걸릴 수 있습니다.
이처럼 Z-버퍼 방법은 구현이 단순하면서도 강력한 성능을 보여주기 때문에, 현대 그래픽 파이프라인에서 은면 제거를 위한 표준적인 기법으로 자리 잡았습니다.