참고 소스 : DirectX SDK – DirectX 11 Tutorial 02

위 소스를 기반으로 연재를 진행합니다.

연재외에 자세한 내용은 소스와 DX SDK 문서를 참조하시면 도움이 됩니다.

 

 


렌더타겟에 렌더링을 하기위해서는 뷰포트의 설정도 필요합니다. 뷰포트라는 것은 렌더타겟의 렌더링 영역에 관한 설정입니다. 렌더타겟에 넓이와 높이, 그리고 깊이값으로 렌더링 영역을 설정할 수 있습니다. 그렇기 때문에 뷰포트는 각 렌더타겟별로 설정합니다. 즉 8개의 렌더타겟이 있으면, 뷰포트 설정 역시 8개를 설정해야 합니다. 뷰포트는 특별한 인터페이스가 있는 것이 아니라, 값을 설정하는 것이기 때문에 뷰포트 구조체에 값을 채우고, 렌더타겟에 세팅해주기만 하면 됩니다.

 

Diagram of the viewport rectangle

 

 

뷰포트는 'ID3D11DeviceContext::RSSetViewports 메소드'로 설정합니다. RS는 래스터라이저(RS) 스테이지를 의미합니다. 즉 파이프라인에서 레스터라이저 스테이지의 설정입니다. 뷰포트의 설정에는 'D3D11_VIEWPORT 구조체'를 사용합니다. 이전의 DX10과는 달리 값들을 실수값으로 지정합니다.

 

'지오메트리 셰이더(또는 버텍스 셰이더)'에서 출력되는 정점의 위치좌표(3D)는 주사변환이 완료된 주사변환 좌표계의 값입니다. (-1<=x<=1, -1<=y<=1, 0<=z<=1) 래스터라이저는 뷰포트 변환을 통해서, 이 3D 좌표 위치로부터 2D 스크린 좌표(0<=x<=1, 0<=y<=1)을 계산합니다.

스크린좌표는 왼쪽위가 (0,0)이고, Y축이 아래쪽 방향인 좌표계입니다. 쉽게 이야기해서 우리가 일반적으로 모니터 화면에서 보는 좌표와 방향이 같습니다. 다만 해상도로 계산하는 것이 아니라 0~1사이의 값으로 높이와 넓이를 계산하는 것입니다. 그래서 백버퍼의 왼쪽위가 (0,0)이 되고, 오른쪽 하단이 (1,1)이 되는 좌표계가 됩니다.

 

뷰포트 변환의 공식은 아래와 같습니다.

X = (x+1) * Viewport.Width * 0.5 + Viewport.TopLeftX

Y = (1-y) * Viewport.Height * 0.5 + Viewport.TopLeftY

Z = Viewport.MinDepth + z * (Viewport.MaxDepth – Viewport.MinDepth)

 

레스터라이저는 렌더타겟의 뷰포트의 내부에 있는 프리미티브(3D모델)로부터 픽셀을 생성합니다. 깊이버퍼의 값은 뷰포트의 깊이값의 범위로 스케일링됩니다.

 

예를 들어, 처음에 깊이값의 범위를 0.0~0.5로 렌더링하고, 다음에 0.5~1.0로 렌더링하게되면, 처음에 렌더링했던 내용이 뒤에 렌더링했던 내용보다도 화면 앞에 렌더링 됩니다. (깊이 버퍼가 유효할 때)

뷰포트의 깊이값은 일반적으로 보통 0.0~1.0사이로 설정합니다.

 

파이프라인에 렌더타겟이 1개가 설정되어 있을 때, 뷰포트를 렌더타겟의 (0,0) ~ (640,480)의 영역으로 설정하는 코드는 아래처럼 됩니다.

 

 

void RSSetViewports(

[in]  UINT NumViewports,

[in]  const D3D11_VIEWPORT *pViewports

);

NumViewports

설정할 뷰포트의 개수

pViewports

뷰포틀 설정할 뷰포트 구조체의 배열

 

D3D11_VIEWPORT 구조체

typedef struct D3D11_VIEWPORT {

FLOAT TopLeftX;

FLOAT TopLeftY;

FLOAT Width;

FLOAT Height;

FLOAT MinDepth;

FLOAT MaxDepth;

D3D11_VIEWPORT;

TopLeftX

뷰포트의 좌상단 X좌표.

범위는 D3D11_VIEWPORT_BOUNDS_MIN ~ D3D11_VIEWPORT_BOUNDS_MAX

TopLeftY

뷰포트의 좌상단 Y좌표.

범위는 D3D11_VIEWPORT_BOUNDS_MIN ~ D3D11_VIEWPORT_BOUNDS_MAX

Width

뷰포트의 넓이. 값은 0이상

Height

뷰포트의 높이. 값은 0이상

MinDepth

뷰포트 깊이값의 최소값. 0.0~1.0 사이값

MaxDepth

뷰포트 깊이값의 최대값. 0.0~1.0 사이값

 

이상으로 백버퍼/렌더타겟뷰/뷰포트를 설정하는 방법을 설명하였습니다. ^^

다음 시간에는 깊이/스텐실 버퍼의 설정에 대해서 이야기하겠습니다.

 

 


알콜코더 민군

언젠가 우즈벡에 미소녀 게임 회사를 차리고 싶은 개발자

3D게임 클라이언트 프로그래머, 살짝 오타쿠…

드래곤볼 온라인 개발, 현재는 네오위즈 서식중

'신입게임 개발자의 서울상경기'와 '초중급 게임개발자 스터디' 운영중