[Visible Surface Detection] Depth Buffer(Z-Buffer) Method
[ Visible Surface Dection - Depth Buffer(Z-Buffer) Method ]
[ Depth Buffer Method ]
가장 대표적이면서 자주 사용되는 image-space 방식
Projection plane에서의 각 pixel position에 대응하는 surface의 Depth 값을 scene 전체에 걸쳐 비교한다.
각 surface에 대해 개별적으로 수행되는데, 이전에 수행했던 surface들의 Depth를 순서와 무관하게 비교한다.
여기서 Depth는 3D Viewing pipeline의 후반에 나왔던 View plane으로 부터의 depth를 의미한다.

이전에 수행했던 surfaces 보다 가깝다면, surface color가 계산되고 depth와 함께 저장된다.
Process가 종료되었을 때, 결국 가장 가까운 depth를 가진 polygon들이 저장되어 있고, 보여지게 된다.
Implementation은 보통 normalized coordinates에서 수행된다.
여기서 말하는 normalized coordinates는 z좌표의 관점에서 normalize되었다는 의미로, viewing pipeline에서 z가 screen좌표계로 오게되면서 범위가 0~1이 되는데 그 좌표계상에서 구현이 된다는 뜻이다. (screen space라고 보면 될듯.)
Depth value는 Near plane에서 0, Far plane에서 1의 값에 해당하는 [0, 1]의 범위를 가진다.
이 방법을 위해 두개의 Buffer가 필요한데,
1) Depth buffer
2) Frame buffer
Color 값이 저장되어 있음
(1) depth buffer의 기본값은 가장 먼 1.0이고, (2) frame buffer의 기본값은 background color를 갖는다.
각 surface는 상단에서 시작해서 Scan Line 순서대로 좌→우 방향으로, 하단으로 내려가며 각 픽셀 (x, y)마다 depth value를 계산한다.
Depth buffer에 있는 이전의 depth보다 작다면, 새로운 depth가 저장, 그 위치에 해당하는 Color가 계산되고 frame buffer에 저장된다.
Depth-Buffer Algorithm은 Back-Face detection이 이미 진행되고나서 수행된다.
[ Polygon table에는 3개의 vertex 좌표만 있는데, Viewing Transform 되고나서 3개의 vertex의 중간 좌표는 어떻게 구할 수 있을까? ]
어떤 surface position x, y)가 주어진다면, 그에 해당하는 Depth는 Plane Equation을 통해 z 값을 계산할 수 있다.

x를 구한 뒤, (x+1)에 대한 depth는 일일이 구해야 할까?
계산은 Scan Line 순서로 진행된다고 했었다.
평면의 방정식에 (x+1)을 넣으면, x와 비교해서 Z' = z - A/C가 된다.
처음 구한 Depth에서 상수에 해당하는 -A/C 만 계산한다면 해당 Scan Line내에서는 순차적으로 계속 구할 수 있다는 뜻이다.

그럼, 첫 Depth는 어떻게 구해야 할까?
각 scan line에서, polygon의 가장 왼쪽 위 vertex에서부터 시작한다.

edge의 기울기(slope)를 m이라 한다면, 다음 시작 지점은 x' = x - 1/m 이 된다.
이걸 다시 평면의 방정식에 대입하면 z' = z + (A/m + B) / C가 된다.
만약 수직선의 경우, m이 무한대에 해당한다고 생각할 수 있으므로 z' = z + B/C가 된다. (y만 1증가 하므로)


이걸 통해 알 수 있는 것은 첫 Depth를 구하는 것도 평면의 방정식을 통해 상수 덧셈 계산으로 가능하고,
이후 각 scan line마다 다음 (x + 1)에 해당하는 Depth를 구하는 것도 -A/C의 상수 덧셈 계산으로 가능하다는 것이다.
→ 구현이 간단하고 효율적이다.
[ Depth Buffer (Z-Buffer) Algorithm의 장단점 ]
장점
- 상수 덧셈 계산으로 인한 구현이 매우 간단, 효율적
- Surface들을 Sorting할 필요가 없음.
단점
1) 화면에 그리는 Frame Buffer 이외에도 Depth Buffer가 추가로 더 필요하다.
ex) 1920x1080 해상도일 경우, 약 200만개의 픽셀에 대응하는 Depth Buffer가 추가적으로 필요한데, 이는 픽셀당 1Byte라 쳐도 2MB에 해당한다.
그래픽카드의 메모리에 저장하는 것은 비싼편이므로, 단점에 해당한다.
2) Surface별로 계산하므로, 겹치는 surface에 대해서 필요없는 중복계산이 이루어진다.
종합적으로 매우 효율적인 알고리즘이므로 Modern Computer Graphics System에서 하드웨어적으로 구현되어 내장되어 있음.
[ Reference ]
Computer Graphics with OpenGL 4th edition, Hearn, Baker