본문 바로가기
IT 기술/Direct3D

Direct3D 초기화 작업(장치, 교환사슬) part1_14일차

by 썬's 2023. 1. 26.

안녕하세요 보글리아입니다.

저번 시간부로 드디어!! Direct3D의 기본 개념과 그래픽 형식을 마무리했습니다 ㅎㅎ

그럼 이번 시간에는 준비운동을 마쳤으니 Direct3D의 초기화 부분을 시작해 보겠습니다.

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

※이번 내용에 들어가기 전 용어정의부터 하겠습니다※


용어정의

  • 그래픽 처리 장치(GPU) :  컴퓨터 시스템 내에서 그래픽 연산을 빠르게 해 그 결괏값을 모니터해 출력하는 연산 장치
  • 인터페이스 : 서로 다른 시스템 간에 소통이 가능하게 설계한 상호 적용 방식
  • 렌더링 : 컴퓨터 프로그램을 사용해 특정 모델이나 이러한 모델들을 모아놓은 장면(Scene)을 영상으로 만들어 내는 과정

1. Direct3D 장치 및 장치 문맥 생성

Direct3D 초기화의 시작점은 Direct3D 11의 장치와 이 장치에 관한 문맥을 생성해야 합니다.

여기서 장치는 ID3D11Device고 장치 문맥은 ID3D11DeviceContext입니다.

이 두 인터페이스는 Direct3D의 주된 인터페이스입니다. 이러한 인터페이스의 역할로

예를 들어 응용 프로그램이 있을 때, 이 응용 프로그램이 두 인터페이스를 사용해 하드웨어에게 GPU에 메모리를 할당, 후면 버퍼를 지우거나, 기하구조를 그리는 등의 명령을 지시하는 역할을 합니다.

인터페이스 역할
인터페이스 역할

Direct3D의 두 인터페이스에 대한 구체적인 얘기를 하자면 다음과 같은 역할을 합니다.

  • ID3D11Device  : 기능 지원 점검 및 자원 할당에 사용
  • ID3D11DeviceContext : 렌더 대상 설정, 자원을 그래픽 파이프라인에 묶음, GPU가 수행할 렌더링 명령 지시에 사용

 


2. 교환 사슬 설정

Direct3D에서 장치를 설정했다면, 이제 다음 단계는 교환 사슬을 생성하는 것입니다.

교환 사슬은 제가 10일 차 수업 때 가르쳐 드린 개념으로 간단히 말하면 모니터 상에 보이는 버퍼를 전면 버퍼 그리고 우리가 볼 수 없는 버퍼이자 다음 프레임 상에 전면 버퍼로서 보여줄 그림을 그리는 후면 버퍼가 매 프레임마다 교환되는 모습이 사슬 모양처럼 보여 이를 교환 사슬이라 합니다.

 

아무튼 DIrect3D에서 교환 사슬을 생성하기 위해서는 DXGI_SWAP_CHAIN_DESC 구조체의 인스턴스를 만들어 원하는 교환 사슬의 특성을 설정합니다. 교환 사슬의 특성을 설정하기 전 이 구조체 안에 어떤 특성이 있는지 알아보겠습니다.

자 그럼 하나씩 뜯어보겠습니다!! 아 그리고 여기서 중요한 점은 앞에 대문자로만 이루어진 단어는 아실 필요 없습니다.

여기서 중요한 것은 뒤에 bufferDesc와 같은 뒤에 있는 영단어가 무엇인지 아시는 게 중요합니다.

교환 사슬 구조체
교환 사슬 구조체

  • BufferDesc : 이는 후면 버퍼를 생성할 때, 이 후면 버퍼의 속성을 어떻게 할 건지 묻는 내용입니다. 예를 들어 버퍼의 너비나 높이, 후면 버퍼의 픽셀의 형식은 어떻게 할 건지에 대한 정보가 나와있습니다. 이 형식은 안에 또 다른 구조체가 있고 이 구조체 안에 각 세부정도는 다음과 같습니다.
typedef struct DXGI_MODE_DESC
{
  UINT Width; // 원하는 후면 버퍼 너비
  UINT Hheight; // 원하는 후며 버퍼 높이
  DXGI_RATIONAL RefreshRate; // 디스플레이 모드 갱신율
  DXGI_FORMAT Format; // 후면 버퍼 픽셀 형식
  DXGI_MODE_SCALINE_ORDER ScanlineOrdering; // 디스플레이 스캔라인 모드
  DXGI_MODE_SCALING Scaling; // 디스플레이 비례 모드
}DXGI_MODE_DESC;
  • SampleDesc : 이는 12일 차에 배운 다중표본화를 위해 추출할 표분 개수와 품질 수준을 몇으로 할 건지 묻는 내용입니다.
  • BufferUsage : 버퍼의 사용 용도를 묻는 내용입니다. 보통 버퍼를 렌더 대상으로 사용하기 때문에 후면 버퍼를 렌더링 하는 DXGI_USAGE_RENDER_TARGET_OUTPUT을 사용합니다.
  • BufferCount : 교환 사슬에 사용할 후면 버퍼의 개수를 몇 개로 할 거냐 묻는 내용입니다. 보통 이중 버퍼링(전면 1, 후면 1)을 사용합니다.
  • OutputWindow : 렌더링 결과를 표시할 창의 핸들입니다.
  • Windowed : 창 모드 사용 여부로 원하면 true 전체 화면을 원하면 false를 지정합니다. 게임으로 예를 들면 창 모드는 화면이 작고, 전체 화면은 모니터 해상도를 꽉 찬 화면이라 보시면 됩니다.
  • SwapEffect : 버퍼를 교환할 때 무슨 효과를 넣고 싶냐는 얘기입니다. 보통 DXGI_SWAP_EFFECT_DISCARD를 지정해 자동으로 효율적인 방법을 선택하게 합니다.
  • Flages : 이 외 추가적인 옵션으로 디스플레이, 모니터 등의 추가적인 설정을 어떻게 할 건지 묻는 내용입니다. 보통 사용하지 않아 0으로 설정합니다.

자 그럼 이 구조체 안에 서술되는 특성의 개념이 무엇인지 알아봤습니다. 특성을 알아봤으니 이제 교환 사슬을 설정해 보겠습니다. 상단에 내용은 제가 DXGI_SWAP_CHAIN_DESC 구조체 안에 있는 개념들을 설명한 것입니다.

이제 이 개념에 맞게 용도를 설정해 줘야 합니다. 교환 사슬 설정을 여기서 하고 생성하는 것은 다음 시간에 하겠습니다.

 

제가 하단 코드에 편의상 구조체 변수명을 ex라 하고 용도에 맞게 설정해 보겠습니다.

여기서 제가 설정한 것이지, 꼭 모든 교환 사슬 설정이 이렇다 한 것은 아니라는 점을 아셔야 합니다.

DXGI_SWAP_CHAIN_DESC ex;
ex.BufferDesc.Width = width; // 창의 가로 폭 길이 1280으로 설정
ex.BufferDesc.Height = height; // 창의 세로 폭 길이 720으로 설정
ex.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // 버퍼 형식 설정
ex.BufferDesc.RefreshRate.Numerator = 60;
ex.BufferDesc.RefreshRate.Denominator = 1;
ex.BufferCount = 1; // 후면 버퍼 사용개수
ex.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT // 버퍼 사용 용도
ex.SampleDesc.Count = 1;
ex.SampleDesc.Quaility = 0;
ex.windowed = true; // 창모드 여부

제가 한 교환 사슬 설정도 마찬가지로 하나씩 뜯어보겠습니다.

  1. 1번째 줄 : 교환 사슬의 이름을 ex라 지음
  2. 2-3번째 줄 : width, height는 각각 창의 가로 폭과 세로 폭 길이로 제가 임의상 1280의 720으로 설정.
  3. 4번째 줄 : 버퍼의 형식을 RGBA의 8비트 부호 없는 값으로 설정.
  4. 5-6번째 줄 : RefreshRate란 디스플레이 모드 갱신율로(주사율 : numerator / Denominator) 60/1로 설정해 1초당 60번 화면이 깜빡이게 설정
  5. 7번째 줄 : 후면 버퍼를 하나만 사용할 것이기에 1로 설정
  6. 8번째 줄 : 버퍼의 사용용도는 후면 버퍼를 렌더 하는 용도로 사용할 것이기 때문에 DXGI_USAGE_RENDER_TARGET_OUTPUT으로 설정
  7. 9-10번째 줄 : 다중표본화 개수는 1, 품질은 따로 안 해줄 것이기 때문에 0으로 설정
  8. 11번째 줄 : 창모드 사용 여부를 true로 사용

오늘은 Direct3D의 장치와 장치 문맥, 그리고 교환사슬을 설정해 봤습니다.

그럼 다음 시간에는 이제 교환사슬을 설정했으니 이를 생성하고 렌더 대상 뷰도 생성해 보겠습니다.

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

댓글