일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- vertex
- 다이렉트 초기화
- C언어
- c
- DirectX12
- Direct3D Init
- DirectX
- DESC
- 동기화
- Direct Init
- 코딩
- engine
- C++
- GPU
- Input Assembler
- CPU
- DirectXTK
- 다이렉트X
- swapchain
- 게임수학
- 다이렉트X 튜토리얼
- 전처리문
- RenderTargetView
- 세팅
- CommandList
- 다중표본화
- 프로그래밍
- Direct3D
- UE4
- View
- Today
- Total
비타Cpp
깊이 버퍼링(Depth Buffer) 본문
깊이 버퍼(depth buffer)는 이미지 자료를 담지 않는 텍스처의 한 예이다. 깊이 버퍼는 각 픽셀의 깊이 정보를 담는다. 픽셀의 깊이는 0.0에서 1.0까지의 값으로 0.0은 시야 절두체(View Frustum) 안에서 관찰자에 최대한 가까운 물체에 해당하고 1.0은 시야 절두체 안에서 최대한 먼 물체에 해당한다. 깊이 버퍼의 원소들과 후면 버퍼의 픽셀들은 일대일로 대응된다(즉, 후면 버퍼의 i,j번째 원소는 깊이 버퍼의 i,j번째 원소에 대응). 예를 들어 후면 버퍼의 해상도가 1280X1024라면 깊이 버퍼는 1280X1024개의 원소들로 구성된다.
한 물체의 픽셀들이 다른 물체보다 앞에 있는지 판정하기 위해, Direct3D는 깊이 버퍼링 또는 z-버퍼링이라는 기법을 사용한다. 여기서 중요한 점은, 깊이 버퍼링을 이용하면 물체들을 그리는 순서와 무관하게 물체들이 제대로 가려진다는 것이다.
위의 그림중 측면도를 보면 확실하게 서로 다른 물체에서 비롯된 세 픽셀이 시야 창(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 |