비타Cpp

깊이 버퍼링(Depth Buffer) 본문

DirectX12/메모

깊이 버퍼링(Depth Buffer)

멍C 2021. 7. 9. 21:09

깊이 버퍼(depth buffer)는 이미지 자료를 담지 않는 텍스처의 한 예이다. 깊이 버퍼는 각 픽셀의 깊이 정보를 담는다. 픽셀의 깊이는 0.0에서 1.0까지의 값으로 0.0은 시야 절두체(View Frustum) 안에서 관찰자에 최대한 가까운 물체에 해당하고 1.0은 시야 절두체 안에서 최대한 먼 물체에 해당한다. 깊이 버퍼의 원소들과 후면 버퍼의 픽셀들은 일대일로 대응된다(즉, 후면 버퍼의 i,j번째 원소는 깊이 버퍼의 i,j번째 원소에 대응). 예를 들어 후면 버퍼의 해상도가 1280X1024라면 깊이 버퍼는 1280X1024개의 원소들로 구성된다.

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

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

 

이그림은깊이 값들을 해당 3차원 장면에 상대적으로 나타냈지만, 실제로 깊이 버퍼에 저장되는 깊이 값들은 [0.0 ~ 1.0]구간의 정규화된 값이다. 

위의 그림중 측면도를 보면 확실하게 서로 다른 물체에서 비롯된 세 픽셀이 시야 창(View Window)의 한 픽셀 P를 두고 경쟁한다. 응용프로그램은 그 어떤 렌더링도 후행하기 전에 먼저 후면 버퍼를 기본 색상(검은색이나 흰색 등)으로 지운다. 이때 깊이 버퍼도 기본값으로 지워지는데, 일반적으로 한 픽셀이 가질 수 있는 최대 깊이인 1.0을 기본값으로 한다. 

 

이제 위의 그림의 물체가 원기둥, 구, 원뿔의 순서로 렌더링한다고 하자. 다음 표는 물체들이 렌더링 됨에 따라 시야 창의 픽셀 P와 그 깊이 값 d가 갱신되는 과정을 요약한 것이다. 시야 창의 다른 픽셀들도 마찬가지 과정을 거친다.

연산 P d 설명
지우기 검은색 1.0 픽셀과 해당깊이 항목이 초기화 된다.
원기둥 그리기 P3 d3 d3 <= d = 1.0이므로 깊이 판정이 성공하며, 그래서 버퍼가 P=P3, d=d3으로 갱신된다.
구 그리기 P1 d1 d1 <= d = d3이므로 깊이 판정이 성공하며, 그래서 버퍼가 P=P1, d=d1으로 갱신된다.
원뿔 그리기 P1 d1 d2>d = d1이므로 깊이 판정이 실패하며, 버퍼는 갱신되지 않는다.

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

 

깊이 버퍼는 하나의 텍스처이므로, 생성 시 특정한 자료 원소 형식을 지정할 필요가 있다.

깊이 버퍼링을 위한 텍스처 자료 원소 형식으로는 다음과 같은 것들이 있다.

 

DXGI_FORMAT_D32_FLOAT_S8X24_UINT: 각 텍셀은 32비트 부동소수점 깊이 값과 [0,255] 구간으로 사상되는 부호 없는 8비트 정수 스텐실 값(스텐실 버퍼에 쓰임),  그리고 다른 용도 없이 채움(padding) 용으로만 쓰이는 24비트로 구성된다.

 

DXGI_FORMAT_D32_FLOAT: 각 텍셀은 하나의 32비트 부동소수점 깊이 값이다.

 

DXGI_FORMAT_D24_UMORM_S8_UINT: 각 텍셀은 [0,1] 구간으로 사상되는 부호 없는 24비트 깊이 값 하나와 [0,255] 구간으로 사상되는 부호 없는 8비트 정수 스텐실 값으로 구성된다.

 

DXGI_FORMAT_D16_UNORM: 각 텍셀은 [0,1] 구간으로 사상되는 부호 없는 16비트 깊이 값이다.

 

 

'DirectX12 > 메모' 카테고리의 다른 글

다중 표본화의 이론  (0) 2021.07.18
Resource & Descriptor(자원과 서술자)  (0) 2021.07.18
SwapChain 과 페이지 전환  (0) 2021.07.09
텍스처 형식(Texture Format)  (0) 2021.07.09
COM(Component Object Model)  (0) 2021.07.09
Comments