행렬 01

2022. 8. 15. 20:10Public/GraphicsAPI

뷰 좌표계나 뷰 행렬은 카메라 좌표계 , 카메라 행렬이라고도 하며, 투영 행렬은 프로젝션 행렬이라고도 한다.

 

TM(Transform Matrix)

로컬 좌표계를 월드 좌표계로 변환하는 행렬을 간단하게 변환 행렬 (Transform Matrix)이라 하고 줄여서 TM이라고 부른다.

TM은 모든 물체마다 고유하게 하나씩 존재한다. 예를들면 3차원 공간에 100개의 물체를 그리려면 100개의 TM이 필요하다는 얘기다.

TM은 반드시 SetTransform(D3DTS_WORLD,&matWorld)처럼 해주어야 하드웨어 가속을 받을 수 있다.

 

 

카메라 변환(Camera transform)

3차원 공간상의 물체를 배치했으면 이들을 보기 위한 카메라를 설치해야 한다.

카메라 변환이란 3차원 월드 좌표계를 카메라를 기준으로 한 카메라 좌표계로 변환하는 것을 말한다.

 

월드 좌표계를 카메라가 기준점인 좌표계로 변환하는 과정이 카메라 변환이다.

일단 , 두 개의 함수를 잘 기억하도록 하자.

 

카메라 변환 행렬 계산

  • D3DXMatrixLookAtLH(&matView,&vEyePt,&vLookatPt,&vUpVec)
  • matView - 변환 행렬이 들어갈 행렬 구조체
  • vEyePt - 카메라의 위치 월드 좌표
  • vLookatPt - 카메라가 바라보는 위치 월드 좌표
  • vUpVec - 카메라의 상방로컬벡터

카메라 변환 행렬 적용

  • SetTransform(D3DTS_VIEW, &matView);

 

투영 변환(projection transform)

월드 좌표계와 카메라 좌표계는 모두 3차원 좌표계이다. 그러나 실제로 우리가 모니터를 통해서 보게되는 화면은 2차원의 화면이다. 그렇다면 3차원 좌표계를 2차원 좌표계로 바꿔주는 변환이 필요하다는 것을 알 수 있다. 

3차원 좌표계를 2차원 좌표계로  변환하는 가장 쉬운 방법은 한 축을 없애는 방법이다. 예를 들어, 모든 정점의 Z값을 0으로 해버리면 결과적으로 x,y 값만 남기 때문에 자연스럽게 2차원 좌표계로 변환되는 셈이다.

가장 많이 사용하는 변환은 원근 투영(perspective projection) 기법으로 카메라와의 거리에 따라서 투영되는 비율이 달라지는 기법이다.

 

카메라 좌표계의 절두체(frustum) 공간이 투영 변환 후에는 (-1,-1,0) ~ (1,1,1) 크기의 사각입방체 공간으로 변형이 된다.

여기서 (0,0~1,0) 의 Z값은 흔히 우리가 말하는 Z버퍼 값으로 사용되고, 나머지 X,Y 값이 화면에 출력되는 값이 된다. 역시 변환 행렬의 도출과정은 생략하고 다음의 함수들을 잘 기억해 두도록 하자.

 

투영 변환 핼열 계산

  • D3DXMatrixPerspectiveFovLH(&matProj,fov,Sw/Sh,Zn,Zf);
  • matProj - 변환 행렬이 들어갈 행렬 구조체
  • FOV - 시야 각(Field Of View)
  • Sw/Sh - 종횡비(가로세로의 비율)
  • Zn - 가까운 클리핑 평면(near clipping plane)
  • Zf - 먼 클리핑 평면(far clipping plane)

투영 변환 행렬 적용

  • SetTransform(D3DTS_PROJECTION,&matProj);

 

 

전체 렌더링 파이프라인(rendering pipeline)

행렬 위주로 살펴본 렌더링 파이프라인이고, 실제 렌더링 파이프라인은 이보다 더 많은 과정을 거친다.

 

'Public > GraphicsAPI' 카테고리의 다른 글

DX11 Tutorial02 코드 설명  (0) 2022.08.22
광원  (0) 2022.08.15
그리기 (Render)  (0) 2022.08.14
정점 버퍼  (0) 2022.08.14
FVF  (0) 2022.08.14