깊이 버퍼링(Depth Buffering).
깊이 버퍼 (depth buffer )는 이미지 자료를 달지 앓는 텍스처의 한 예이다. 깊이 버퍼는 각 픽셀의 깊이 정보를 담는다. 픽셀의 깊이는 0 에서 1.0 까지의 값으로 , 0.0 은 시야 절투체 ( view frustum ) 안에서 관찰자에 최대한 가까운 물체에 해당하고 1.0은 시야 절두체 안에서 관찰자와 최대한 먼 물체에 해당한다. 깊이 버퍼의 원소들과 후면 버퍼의 픽셀들은 일대일로 대응된다. (즉 , 후면 버퍼의 ij번째 원소는 깊이 버퍼의 ij번째 원소에 대응된다.) 예를 들어 후면 버퍼의 해상오가 1280 x 1024 라면 깊이버퍼는 1280 x 1024 개의 원소들로 구성된다 . 아래 그림은 몇몇 물체가 다른 물체들을 가리고 있는 간단한 장면이다. 한 물체의 픽셀들이 다른 물체보다 앞에 있는지 판정화기 위해, Direct3D는 깊이 버퍼링 또는 z - 버퍼링이라는 기법을 사용한다. 여기서 중요한 점은 , 깊이 버퍼링을 이용하면 물체들을 그리는 순서와 무관하게 물체들이 제대로 가려진다는 것이다.
(주의 점.) 당연히 깊이 버퍼를 안 쓰고 차례대로 물체를 그려나가며 표현할 수도 있지만, 두가지 문제점이 있다고 한다. 첫번째는 물체가 많으면 차례대로 그리기 때문에 너무 오래걸린다는 것이며, 두번째는 맞물린 형태의 물체들을 제대로 처리하지 못한다는 것이다.
깊이 버퍼링의 작동 방식을 예를 통해서 살펴보면 아래그림에 관찰자가 보는 3차원 장면과 그 장면의 2 차원측면도가 있다. 측면도를 보면 확실하게 알 수 있지만, 서로 다른 물체에서 비롯된 세 픽셀이 시야 창 (view window) 의 한픽겔 P 를 두고 경쟁한다(물론 우리는 관찰자과 가장 가까운 픽셀이 다른 픽셀들을 가리므로 그 픽셀이 p에 그려져야 제대로 된 결과가 나옴을 알고 있지만, 컴퓨터는 그렇지 못한다). 응용 프로그램은 그 어떤 랜더링도 수행하기 전에 먼저 후면 버퍼를 기본 색상 ( 검은색이나 흰색등 )으로 지운다. 이때 깊이 버퍼도 기본값으로 지워지는데 일반적으로 한 픽셀이 가직수 있는 최대 깊이인 1.0 을 기본값으로 사용한다. 이제 물체들을 원기동, 구, 원뿔의 순서로 랜더링한다고 하자 . 다음 표는 물체들이 렌더링됨에 따라 시야 창의 픽셀P와 그 깊이 값d가 갱신되는 과정을 요약한것이다. 시야창의 다른픽셀들도 마찬가지 과정을 거친다 .
연산 | P | d | 설명 |
지우기 | 검은색 | 1.0 | 픽셀과 해당 깊이 항목이 초기화된다. |
원기둥 그리기 | P3 | d3 | d3 < d = 1.0 이므로 깊이 판정이 성공하며, 그래서 버퍼가 |
구 그리기 | P1 | d1 | d1 < d = d3 이므로 깊이 판정이 성공하며, 그래서 버퍼가 P = P1, d = d1로 갱신된다. |
원뿔 그리기 | P1 | d1 | d2 > d = d1 이므로 깊이 판정이 실패하며, 버퍼는 갱신되지 않는다. |
이 예에서 보듯이, 픽셀과 해당 깊이 값은 그 깊이 값이 깊이 버퍼에 이미 들어 있던 값보다 작은 경우에만 후면 버퍼와 깊이 버퍼에 기록된다. 이런 방식에서는 항상 관찰자에 가장 가까운 픽셀이 렌더링된다. (확신이 들지 않는다면, 물체들을 그리는 순서를 바꾸어서 다시 시도해 보기 바란다.) 정리하자면, 깊이 버퍼링 알고리즘은 랜더링되는 각 픽셀의 깊이 값을 계산해서 깊이 판정을 수행함으로써 작동한다. 깊이 판정은 후면 버퍼의 특정 픽셀 위치에 기록될 픽셀들의 깊이들을 비교한다. 깊이 값을 비교했을 때 관찰자에게 가장 가까운 픽셀이 승자가 되어서 후면 버퍼에 기록된다. 다른 물체를 가리는 물체의 픽셀이 바로 관찰자에게 가장 가까운 픽셀이라는 점을 생각하면 이 알고리즘이 합당하다는 점을 이해할 수 있을것이다. 깊이 버퍼는 하나의 텍스처이므로, 생성 시 특정한 자료 원소 형식을 지정할 필요가 있다. 깊이 버퍼링을 위한 텍스쳐 자료 원소 형식으로는 다음과 같은 것들이 있다.
I . DXGI_FORMAT_D32_FLOAT_S8x24_UNIT : 각 텍셀은 32비트 부동 소수점 깊이 값과 [0, 255]구간으로 사상되는 부호 없는 8비트 정수 스텐실값 그리고 다른 용도 없이 채움 ( Padding) 용으로만 쓰이는 24 비트로 구성된다.
2 . DXGI_FORMAT_D32_FlOAT : 각 텍셀을 하나의 32비트 부동소수점 깊이 값이다.
3 . DXGI_FORMAT_D24_UNORM_S8_UINT : 각 텍셀은 [0, 1] 구간으로 사상되는 부호 없는 24비트 깊이 값 하나와 [0, 255 ] 구간으로 사상되는 부호 없는 8비트 정수 스텐실 값으로 구성된다.
4. DXGI_FORMAT_D16_UNORM : 각 택설은 [0, 1] 구간으로 사상되는 부호 없는 16비트 깊이 값이다.
참고 : 응용 프로그램이 스텐실 버퍼를 반드시 사용해야 하는 것은 아니다. 만일 사용한다면 스텐실 버퍼는 항상 깊이 버퍼와 같은 텍스처에 포함된다. 예를 들어 32비트 형인 DXGI_FORMAT_D24_UNORM_S8_UINT은 그 중 24비트를 깊이 버퍼에 , 나머지 8비트를 스텐실버퍼에 사용한다. 이 때문에 깊이 버퍼보다는 깊이-스텐실 버퍼라는 용어 가 더 정확하다 .
깊이 버퍼 - UWP applications
깊이 버퍼 또는 z-버퍼는 깊이 정보를 저장하여 다각형의 어떤 부분이 시야에서 숨겨지지 않고 렌더링될지 제어합니다.
learn.microsoft.com