본문 바로가기
IT 기술/Direct3D

Direct3D 초기화 작업(렌더 대상 뷰) part2_15일차

by 썬's 2023. 1. 26.

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

저번 시간에는 Direct3D의 장치와 교환 사슬을 설정했습니다.

이번 시간에는 이전 시간에 설정한 교환 사슬을 생성하고 추가적으로 렌더 대상 뷰도 알아보겠습니다.

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

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


용어정의

  • 인터페이스 : 서로 다른 시스템 간에 소통이 가능하도록 설계한 상호작용 방식
  • 인스턴스 : 실행중인 프로세스
  • 그래픽 : 시각적인 표현으로 컴퓨터 모니터 화면에 보이는 요소를 말한다.
  • 메서드 : 클래스 내부에 정의된 함수. 그냥 함수의 유의어로 보시면 됩니다.

1. 교환 사슬 생성

Direct3D에서 교환 사슬을 설정했다면 이제 IDXGIFactory 인스턴스를 사용해 IDXGISwapChain::CreateSwapChain 메서드를 호출해서 교환 사슬 인터페이스를 생성해야 합니다. IDXGIFactory를 교환 사슬 인터페이스라 합니다.

일단 교환 사슬 생성은 IDXGIFactory 인스턴스로 해주시면 됩니다. 사실 이 부분은 잘 사용하지 않기도 합니다.

교환 사슬을 설정만 해두고 따로 생성하지는 않고 설정한 것에서 필요한 것들만 뽑아 사용하는 경우가 대부분입니다.

 

여기서 추가적인 설명을 하겠습니다. 이는 교환 사슬 생성과 관련한 내용은 아닙니다.

Direct3D에는 별도로 분리한 개념인 DXGI라는게 있습니다. 이 DXGI는 교환 사슬 설정, 그래픽 하드웨어 나열, 창 모드나 전체화면 모드 전환 등의 그래픽과 관련한 작업을 합니다. 이러한 그래픽적인 부분을 주로 API라 합니다.

이를 Direct3D와 분리한 이유는 예를 들면 Direct2D와 같은 다른 그래픽 API에는 다른 그래픽적인 부분에 설정이 필요하기 때문에 Direct3D와 DXGI를 분리한 것입니다.

 


2. 렌더 대상 뷰 생성

Direct3D에서 교환 사슬 설정을 마무리 했으면 이제 렌더 대상 뷰를 생성해야 합니다.

렌더 대상이란 즉 화면에 나타낼 객체를 말합니다. 이러한 객체에는 큐브나, 구체, 비행기 등이 있습니다.

즉 렌더 대상 뷰는 나타낼 객체를 표현할 수단?이라고 하시면 됩니다. 그럼 뷰는 후면 버퍼겠죠?? ㅎㅎ

 

Direct3D에서 자원이 있습니다. 이 자원은 저희가 향후 배울 파이프라인 단계에 직접 묶이지 않습니다.

파이프라인에 대한 내용은 향후 설명하겠습니다. 일단은 파이프라인은 자원을 화면상에 나타내기 위한 일련의 과정이라고 생각해 주시면 됩니다.

아무튼 이 자원은 파이프라인 단계에 직접 묶이는 것이 아니기 때문에 자원에 대한 뷰를 먼저 생성하고 생성한 뷰를 파이프라인 단계에 직접 묶어야 합니다. 그렇기에 후선 후면 버퍼에 대한 렌더 대상 뷰를 생성해야 합니다.

렌더 대상 뷰를 설정하는 메서드는 다음과 같습니다.

 

IDXGISwapChain::GetBuffer(후면 버퍼 색인, 버퍼 인터페이스 형식, 후면 버퍼 포인터) 

-> 이 메서드에는 3개의 매개변수를 가집니다. 먼저 첫 번째는 후면 버퍼의 색인으로 후면 버퍼가 하나면 0, 두 개면 1로 설정하시면 됩니다. 두 번째는 버퍼의 인터페이스 형식으로 쉽게 말해 텍스처를 2d로 뽑을 거냐 3d로 뽑을 거냐는 의미입니다. 보통 텍스처를 2차원 텍스처로 뽑기 때문에 ID3D11Texture2D를 사용합니다. 세 번째는 후면 버퍼를 가리키는 포인터를 돌려주시면 됩니다.

 

ID3D11Device::CreateRenderTargetView(렌더 대상, 자원 형식, 렌더 대상 뷰 반환)

-> 이 메서드가 렌더 대상 뷰를 생성하는 메서드이고 3개의 매개변수를 가집니다. 첫 번째는 렌더 대상으로 사용할 자원입니다. 즉 저희는 후면 버퍼를 자원으로 사용하기 때문에 후면버퍼를 지정하시면 됩니다. 두 번째는 자원에 담긴 원소들의 자료형식을 지정합니다. 보통 후면 버퍼는 형식을 지정해서 생성한 자원이라 널 값을 넣으시면 됩니다. 세 번째는 생성한 렌더 대상 뷰를 돌려줍니다.

 

IDXGISwapChain::GetBuffer

-> 이 메서드를 호출하면 후면 버퍼에 대한 COM 참조 횟수가 증가합니다. 후면 버퍼를 다 사용하고 난 후 반드시 코드 끝에 후면 버퍼를 해제하셔야 합니다. 만약 해제하지 않으면 후면 버퍼가 계속해서 참조됩니다.


오늘은 Direct3D의 교환 사슬 생성과 렌더 대상 뷰에 대해 알아봤습니다.

다음 시간에는 깊이버퍼 뷰 생성과 이러한 뷰들을 출력 병합기 단계에 묶는 과정을 진행하겠습니다.

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

댓글