본문 바로가기
IT 기술/Direct3D

Direct3D 초기화 작업(뷰포트) part4_17일차

by 썬's 2023. 1. 26.

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

저번 시간에는 깊이 버퍼 뷰를 설정해 봤는데요

이번 시간에는 이전 시간에 이어 뷰포트라는 것을 설정해 보겠습니다.

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


뷰포트 설정

Direct3D에서 3차원 장면은 보통 후면 버퍼 전체에 그립니다. 후면 버퍼의 크기로 1280에 720이면 3차원 장면 역시 이 크기에 맞춰 그립니다. 그러나 만약 3차원 장면을 후면 버퍼의 일부를 차지하는 직사각형 영역에만 그리는 것도 가능합니다.

이러한 후면 버퍼 일부 영역에 장면을 그려 넣고자 하는 부분직사각형을 뷰포트(viewport)라 합니다.

뷰포트(Viewport)
뷰포트(viewport)

 

다음은 뷰포트에 관한 구조체입니다.

이 구조체 안에는 다음과 같은 멤버 변수가 있습니다.

  • TopLeftX : 뷰포트의 직사각형 x축 위치
  • TopLeftY : 뷰포트의 직사각형 y축 위치
  • Width : 뷰포트의 가로 크기
  • Height : 뷰포트의 세로 크기
  • MinDepth : 최소 깊이 버퍼 값
  • MaxDepth : 최대 깊이 버퍼 값
typedef struct D3D11_VIEWPORT
{
  FLOAT TopLeftX;
  FLOAT TopLeftY;
  FLOAT Width;
  FLOAT Height;
  FLOAT MinDepth;
  FLOAT MaxDepth;
}D3D11_VIEWPORT

여기서 추가적인 설명을 하자면 TopLeftX, TopeLeftY, Width, Height는 뷰포트의 직사각형 위치와 크기입니다.

예를 들어 게임 화면이 있다고 해보겠습니다. 보통 게임할 때 화면은 꽉 찬 화면에서 합니다. 여기서 캐릭터의 상태창을 열 때 이 상태창은 게임 화면 구석에 작은 직사각형 형태로 나타나 상태창을 표시합니다. 이런 상황에서 뷰포트를 사용합니다.

즉, 뷰포트는 응용 프로그램 창의 클라이언트 영역 직사각형이다고 보시면 됩니다.

 

깊이 버퍼는 11일 차에서 설명드렸듯이 범위는 0에서 1입니다.

특수 효과를 넣지 않는 이상 깊이 버퍼의 최솟값은 0, 최댓값은 1로 설정해 두시는 게 좋습니다.

 

다음 하단은 D3D11_VIEWPORT를 제가 임의로 만들어 보겠습니다. 변수명은 exView라 하겠습니다.

여기서 주의하실 점은 제가 임의로 만든 것이지 꼭 모든 VIEWPORT 설정이 이렇다 하는 것은 아닙니다.

D3D11_VIEWPORT exView
exView.TopLeftX = 0.0f;
exView.TopLeftY = 0.0f;
exView.Width = WIN_Width(1280으로 임의로 설정하겠습니다)
exView.Height = WIN_HEIGHT(720으로 임의로 설정하겠습니다)
exView.MinDepth = 0.0f;
exView.MaxDepth = 1.0f;

 

D3D11_VIEWPORT 구조체를 이제 다 채우셨다면 ID3D11DeviceContext::RSSetViewports 메서드를 사용해 Direct3D에 뷰포트가 있다는 것을 알려줘야 합니다. 이에 대한 예는 다음과 같습니다.

 

DC는 제가 14일 차에 설명한 장치를 임의로 설정한 것입니다.

첫 번째 매개변수는 묶을 뷰포트 개수입니다. 보통은 하나만 설정해서 1로 두시면 됩니다.

두 번째 매개변수는 위에서 만든 뷰포트, 즉 exView의 주소값을 &exView라 넣으시면 됩니다.

다시 정리하면 "Direct3D에 장치를 설정하고 이 장치에 뷰포트를 설정할 건데, 뷰포트 개수는 몇 개로 할 거고 네가 만든 뷰포트를 찾아야 하니까 주소값을 적어"라는 의미입니다 ㅎㅎ

DC->RSSetViewports(뷰포트 개수, 뷰포트 주소값);

 

Direct3D의 뷰포트 사용 예시를 상단에서 게임으로 예를 들었는데, 조금 더 예를 들어보겠습니다.

하단 이미지를 보시면 정중앙 부분이 뷰포트로 만든 플레이어가 플레이하는 게임 화면입니다. 

그리고 뷰포트를 기준으로 상하좌우는 사용자 인터페이스, 흔히 UI라고 하죠. 채팅창이나 월드맵 등의 UI를 채웁니다.

이런 식으로 뷰포트를 사용합니다. 다른 예시로는 화면을 반으로 나눠 좌우에 뷰포트를 하나씩 두고 왼쪽 뷰포트는 플레이어가 게임을 플레이하는 화면, 오른쪽 화면은 상대방이 게임을 플레이하는 화면으로 사용하기도 합니다.

뷰포트 예시
뷰포트 예시


오늘은 Direct3D의 초기화 작업 중 하나인 뷰포트에 대해 알아봤습니다.

이제 초기화 작업은 모두 마쳤습니다. 사실 세부적으로 들어가면 엄청 많지만.. 그것들을 다 설명하기에는 저희가 갈 길이 조금 멀어서 초기화 작업은 여기서 마치겠습니다.

그럼 다음 시간에는 드디어 렌더링 파이프라인에 대해 배워보도록 하겠습니다.

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

댓글