본문 바로가기
IT 기술/Direct3D

Direct3D 기본 형식 및 그래픽 개념 part3_11일차

by 썬's 2023. 1. 20.

오늘은 Direct3D의 깊이 버퍼링에 대해 알아보겠습니다.

깊이 버퍼링 역시 Direct3D의 중요한 형식 중 하나로 꼭 아셔야 합니다.

※제 수업은 이전주차에서 배운 개념을 재차 설명하지 않습니다※

※이번 내용은 용어가 어려워 먼저 용어 정리를 하겠습니다※


용어 정의

  • 픽셀 : 하나의 이미지를 구성하고 있는 무수히 많은 정사각 형태의 입자
  • 텍셀 : 픽셀에 입체감이나 질감 등을 줌
  • 부동소수점 : 1.2, -3.2 등과 같은 소수 형태로 C++에서는 소수 뒤에 f를 붙여 표기
  • 행렬 : 행과 열로 이루어진 형태로 n x q 행렬일 때, n이 행 q가 열
  • 텍스처 : 색상이나 질감 등을 표현하는 데 사용하는 2d 이미지

1. 깊이 버퍼(depth buffer)

Direct3D에서 깊이 버퍼란 각 픽셀마다의 깊이 정보를 다르게 줍니다. 픽셀의 깊이는 최솟값인 0.0에서 최댓값인 1.0까지 있습니다. 관찰자에서 가장 가까운 픽셀의 깊이는 0.0이고 가장 멀리 있는 픽셀의 깊이는 1.0이라 합니다.

 

깊이 버퍼는 주로 객체(물체)에 대한 정확도를 나타내는 데 사용합니다. 

예를 들어 3d 화면상에서 화면과 가까운 객체는 색상에 대한 높은 정확도를 요구하지만, 화면상에서 멀리 있는 물체는 정확도가 떨어집니다.

이해를 돕기 위해 여러분들이 만약 산을 본다고 가정해 보겠습니다. 산을 멀리서 보면 초록색으로 보이실 겁니다. 그렇지만 산에 점점 가까워지면 산에 있는 나무나 바위 등이 보이기 시작하면서 갈색이나 회색 등의 색상도 같이 보이게 됩니다.

 

하단 이미지를 보겠습니다. 이 이미지는 깊이 버퍼가 적용됐습니다.

이 이미지는 직사각형 형태이고 무수히 많은 정사각 형태의 픽셀로 이루어져 있습니다.

이 픽셀마다 깊이값은 0.0에서 1.0으로 각각 설정해 명암도를 다르게 설정합니다.

즉, 각 픽셀마다 정확도를 다르게 나타낸 결과물로 볼 수 있습니다.

 

깊이 버퍼
깊이 버퍼 예시

여기서 보듯이 깊이 버퍼값은 0.0에서 1.0 사이의 값으로 나타내기 때문에, 부동소수점입니다.

깊이 버퍼 내 요소(여기서 하나의 픽셀의 색상)는 후면 버퍼의 픽셀과 일대일로 대응합니다.

예를 들면 깊이 버퍼와 후면 버퍼의 각각의 nq번째(행렬) 요소와 대응합니다. 후면 버퍼의 해상도가 1280 x 1024면 깊이 버퍼의 해상도도 1280 x 1024입니다.

 

3D 화면상에는 여러 물체가 있을 겁니다. 그리고 이 물체마다 화면상의 거리도 다르고 어떤 물체는 다른 물체를 가리고 있을 수 있습니다. 이럴 때 사용하는 것이 깊이 버퍼링(depth Buffering) 또는 z-버퍼링 기법을 사용합니다.

이 기법을 사용할 때 중요한 점은 물체마다 그리는 순서는 중요하지 않습니다.

 

즉 정리하자면, 이미지의 각 픽셀의 깊이 값들을 계산해 깊이값 판정을 하고, 깊이 값을 비교해 가장 가까운 픽셀은 정확도가 선명하게 보이고 멀리 있는 픽셀은 정확도가 떨어져 보이게 됩니다.

깊이 버퍼 역시 하나의 전면, 후면 버퍼와 같은 텍스처 이기 때문에 DirectX에서 제공하는 자료 형식을 가집니다.

  • DXGI_FORMAT_D32_FLOAT : 각 텍셀은 하나의 32비트 부동소수점 값
  • DXGI_FORMAT_D16_UNORM : 각 텍셀은 [0, 1] 구간으로 사상되는 부호 없는 16비트 깊이 값
  • --> FLOAT은 부동소수점, UNORM은 부호가 없는 값입니다. 가운데가 비트값을 나타냅니다.

오늘은 이전 시간에 배운 텍스처인 전면 버퍼와 후면 버퍼에 이어 또 다른 텍스처인 깊이 버퍼를 배워봤습니다.

다음 시간에는 픽셀에 대한 이야기를 조금 더 해보려고 합니다

그럼 오늘도 긴 글 읽어주시느라 고생 많으셨습니다~

 

댓글