본문 바로가기
IT 기술/Direct3D

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

by 썬's 2023. 1. 19.

오늘은 Direct3D의 텍스처 자료와 버퍼에 대해 알아보겠습니다.

이 텍스처와 버퍼를 알아야 Direct3D의 초기화 작업을 진행하실 수 있습니다.

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

※이번 내용은 용어가 어려워 용어 정리부터 하겠습니다※


용어 정의

  • 텍스처 : 이미지 자료 저장과 객체를 봤을 때 육안으로 보이는 성질(예. 명암이나 색상 등)
  • 객체 : 실제 하거나 존재하는 것으로 자동차나 책상 등이 있다.
  • 픽셀 : 작은 정사각형 점으로 이게 수십 개에서 수천 개가 모여 하나로 된 행과 열로 된 배열 형태를 띤다.
  • 배열 : 일정한 차례나 간격에 맞춰 줄을 세운 형태
  • 프레임 : 정지화면의 개념으로 영상 시청 시 영상을 정지하면 영상이 멈추는 데 그 화면이 하나의 프레임이다.

1. 텍스처 및 자료 자원 형식

Direct3D에서 텍스처는 쉽게 말해 객체의 자료에 대한 정보를 담습니다. 텍스처는 배열 형태로 되어 있습니다.

예로 2차원 텍스처는 2차원 배열을 가진 2차원 이미지 자료를 저장할 수 있습니다. 1차원 텍스처는 1차원 배열이고 3차원텍스처는 3차원 배열입니다.

객체가 있을 때 텍스처 내 각 원소 내에서 한 픽셀마다 색상을 담아 전체 색상을 띠게 합니다.

하단 이미지를 보시면 마리오 캐릭터는 작은 정사각형이 배열 형태로 순서대로 나타나 하나의 큰 정사각형 형태를 띠게 됩니다. 이 정사각형 하나하나를 픽셀(원소)이라고 하고 이 픽셀에 색상이 들어가 하나의 이미지 자료가 나옵니다.

 

마리오 픽셀
텍스처 내 픽셀

그렇다고 텍스처는 아무 이미지나 다루지는 못합니다. 특정 형식을 띠어야 하는데요

그 구체적인 형식은 DXGI_FORMAT으로 지정한 형식 만들을 다룰 수 있습니다. DXGI_FORMAT 형시은 다음과 같습니다.

  • DXGI_FORMAT_R32G32B32_FLOAT : 각 원소는 32비트 부동소수점 성분 세 개로 이루어짐
  • DXGI_FORMAT_R32G32_UINT : 각 원소는 32비트 부호 없는 정수 성분 두 개로 이루어짐
  • DXGI_FORMAT_R8G8B8A8_UNORM : 각 원소는 [0, 1] 구간으로 사상되는 8비트 부호 없는 성분 네 개로 이루어짐
  • DXGI_FORMAT_R8G8B8A8_SNORM : 각 원소는 [-1, 1] 구간으로 사상되는 8비트 부호 있는 성분 네 개로 이루어짐
  • DXGI_FORMAT_R8G8B8A8_SINT : 각 원소는 [-128, 127] 구간으로 사상되는 8비트 부호 있는 성분 네 개로 이루어짐
  • DXGI_FORMAT_R8G8B8A8_UINT : 각 원소는 [0, 255] 구간으로 사상되는 8비트 부호 있는 성분 네 개로 이루어짐

여기서 하나씩 뜯어보면, DXGI_FORMAT_R8G8B8A8_UINT로 설명하겠습니다.

DXGI_FORMAT_은 텍스처 사용을 위한 자료형식입니다. R8G8B8A8을 보면 RGBA로 이루어진 8비트 부호형식을 가진 것을 뜻합니다. 여기서 성분이란  RGBA로 각각 red(빨강), green(녹색), blue(청색), alpha(투명도) 성분을 뜻합니다.

쉽게 말해 이미지 자료는 빨강, 녹생, 청색으로 이루어진 색상을 잘 조합해 이미지를 만듭니다. 알파 성분은 이미지의 투명도를 뜻합니다. 이미지마다 투명도가 다릅니다.

그리고 뒤에 있는 FLOAT, UINT, UNORM 등은 C++에서 사용하는 자료형식들로 일단은 크게 외우실 필요는 없습니다.

제가 향후 이러한 자료형식들은 C++ 수업에서 자세히 다루겠습니다.

RGB 색상표
RGB 색상표

Direct3D에서 모든 텍스처에 자료형식을 바로 지정하는 것은 아닙니다.

예를 들면 DXGI_FORMAT_R8G8B8A8_TYPELESS이라는 형식이 있는데 뒤에 TYPELESS가 붙으면 텍스처의 메모리만 일단 확보해 두고 텍스처의 자료형 식은 향후 지정하겠다는 의미입니다.


2. 교환사슬(swap chain)

Direct3D 그래픽 화면상에서 애니메이션이 재생된다고 했을 때, 

이 애니메이션은 컴퓨터 화면상에서 전면 버퍼와 후면 버퍼가 번갈아가면 애니메이션을 만들어줍니다.

자 여기서 전면 버퍼가 여러분들이 지금 보고 계시는 화면입니다. 그리고 후면 버퍼는 여러분이 볼 수 없는 화면입니다.

여러분들이 친숙한 원피스 애니메이션을 예로 들면, 원피스에 캐릭터가 움직인다고 봤을 때, 매 프레임마다 후면 버퍼에

다음 장면을 그려 이를 프레임마다 번갈아가며 보여주기 때문에, 캐릭터가 움직이는 것처럼 보이고 사용자는 후면 버퍼에 그림이 그려지는 것을 볼 수 없어, 그 결과 사용자는 완성된 애니메이션만 볼 수 있습니다.

 

전면 버퍼의 역할은 그저 여러분들께 완성된 그림을 보여주는 역할을 합니다.  여기서 중요한 것은 후면 버퍼입니다. 후면 버퍼는 사실상 그림을 완성시키는 역할을 하기 때문에 색상 정보를 가지고 있습니다. 쉽게 말해 그림을 그리려면 색상으로 칠해야 하는 것과 같습니다. 이 완성된 그림을 다음 프레임의 전면 버퍼로 나타납니다.

 

버퍼가 그려지는 과정은 다음과 같습니다.

  1. 전면 버퍼가 컴퓨터 화면에 나타납니다.
  2. 전면 버퍼가 사용자에 보이는 동안 후면 버퍼에 다음 프레임에 보일 그림을 미리 그려놉니다.
  3. 다음 프레임에 전면 버퍼와 후면 버퍼의 위치를 바꿉니다. 그럼 후면 버퍼가 전면 버퍼가 되고 전면 버퍼는 후면 버퍼가 되어 또 다음 프레임에 전면 버퍼로써 보여줄 그림을 미리 그려놉니다.
  4. 이 과정을 반복해 매 프레임마다 완성된 그림을 전면 버퍼에 그려 화면상에 보여주기 때문에, 사용자는 완성된 그림만을 매 프레임마다 볼 수 있어 애니메이션이 완성됩니다.
  5. 이 모습이 마치 사슬모양 같아 교환사슬이라고 부릅니다.

교환사슬(swap chain)

Direct3D에서 교환사슬을 다루는 인터페이스는 IDXGISwapChain입니다.

이 인터페이스는 전면 버퍼 텍스처와 후면 버퍼 텍스처에 대한 정보를 가집니다.

IDXGISwapChain::ResizeBuffers는 버퍼 크기 변경을, IDXGISwapChain::Present는 버퍼 제시에 대한 메서드를 제공합니다. 여기서 제시한 후면 버퍼를 전면 버퍼와 교환해 화면에 나타나게 하는 것을 뜻합니다.

 

이중 버퍼링이란 전면과 후면 버퍼 두 개만 사용하는 것을 말합니다. 삼중 버퍼링은 전면 하나와 후면 두 개를 사용하는 것을 말합니다. 이렇게 보면 삼중 버퍼링이 더 효율적인 것처럼 보이지만 현업에서는 이중 버퍼링으로도 충분하기 때문에, 삼중 버퍼링은 거의 안 쓰인다고 보시면 됩니다.


오늘은 텍스처와 교환사슬에 대해 알아봤습니다.

그럼 다음 시간에는 Directr3D의 다른 기본 형식에 대해 알아보도록 하겠습니다.

긴 글 읽으시느라 고생 많으셨습니다~~

댓글