기록공간

[DirectX 12] 기본지식 - 깊이 버퍼링(Depth Buffering) 본문

DirectX/기초

[DirectX 12] 기본지식 - 깊이 버퍼링(Depth Buffering)

입코딩 2020. 2. 3. 11:42
반응형

깊이 버퍼(Depth Buffer)는 앞서 텍스처 형식에서 잠깐 다루었듯이 이미지 자료를 담지 않는 텍스처의 한 예이다. 깊이 버퍼는 각 픽셀의 깊이 정보를 담고 있다. 픽셀의 깊이는 0.0에서 1.0사이의 값으로 0.0은 시야 절두체(View Frustum)안에서 가장 가까운 물체에 해당하고 1.0은 절두체 안에서 가장 먼 물체에 해당한다. 

 

깊이 버퍼의 원소들과 후면 버퍼의 픽셀들은 일대일로 대용된다. 예를 들면 후면 버퍼의 해상도가 1280 x 1024라면 깊이 버퍼 또한 1280x1024개의 원소들로 구성된다.

 

몇몇 물체가 다른 물체들을 가리고 있다고 해보자 한 물체의 픽셀들이 다른 물체보다 앞에 있는지 판정하기 위해 Direct3D는 깊이 버퍼링 또는 z-버퍼링이라는 기법을 사용한다. 깊이 버퍼링을 이용하면 물체들을 그리는 순서와 무관하게 물체들이 제대로 가려진다.

 

서로를 부분적으로 가리는 물체들

 

깊이 문제를 해결하는 한 방법은 장면의 물체들을 먼 것에서 가까운 것 순서로 그리는 것이다.

그렇게 하면 가까운 물체가 먼 물체를 덮기 때문에 결과적으로 물체들이 제대로 가려진 모습이 된다. 이는 화가가 장면을 그리는 방식과 일치한다(우리 교수님께서는 화가 알고리즘이라고도 불렀다). 하지만 이 방법은 두 가지 문제점이 존재한다. 하나는 물체들을 정렬해야 한다는 것이다. 이는 물체가 많았을 경우 오래 걸릴수 있다. 또 하나는 맞물린 형태의 물체들을 제대로 처리하지 못한다는 것이다.

 

반면 깊이 버퍼링은 그래픽 하드웨어에서 공짜로 일어나며, 맞물린 물체들도 제대로 처리된다.

깊이 버퍼링의 작동 방식을 예를 통해서 살펴보도록 하자.

 

처음 지우기 단계에서 초기화가 진행된다. 이제 원기둥을 그리기 시작하는데 초기화 한 깊이 값d = 1.0보다 원기둥 깊이값 d3이 d3 <= d를 만족하므로 깊이 판정이 성공하며, 버퍼가 검은색 P 에서 원기둥 픽셀 P3으로, d = d3로 갱신된다. 그리고 구를 그리는데 d1 <= d(=d3) 이므로 깊이 판정에 성공하며, 버퍼가 P = P1, d = d1로 갱신된다. 마지막으로 원뿔 그리기에서는 d2 > d(=d1)이므로 깊이 판정이 실패하며, 버퍼는 갱신되지 않는다.

 

이 예에서 보듯이, 픽셀과 해당 깊이 값은 그 깊이 값이 깊이 버퍼에 이미 들어 있던 것보다 작은 경우에만 후면 버퍼와 깊이 버퍼에 기록된다. 고로 항상 관찰자에 가장 가까운 픽셀이 렌더링 되게 되는것이다.

 

정리하자면, 깊이 버퍼링 알고리즘은 렌더링되는 각 픽셀의 깊이 값을 계산해서 깊이 판정을 수행함으로써 작동한다. 깊이 판정은 후면 버퍼의 특정 픽셀 위치에 기록될 픽셀들의 깊이들을 비교한다. 비교 했을때 관찰자에게 가장 가까운 픽셀이 승자가 되어 후면 버퍼에 기록된다. 다른 물체를 가리는 물체의 픽셀이 바로 관찰자에게 가장 가까운 픽셀이라는 점을 생각하면 이 알고리즘이 합당하다는 점을 이해할 수 있을 것이다.

반응형
Comments