Post List

2017/12/17

DirectX3D__렌더링 파이프라인

오늘은 렌더링파이프라인에 대해 알아보겠습니다. 
렌더링 파이프라인이란, 3D 공간 카메라를 설정하고 모니터에 2D로 표현하기까지의 일련의 과정을 랜더링 파이프라인이라고 합니다.


위 과정을 거치며 최종적으로 화면에 뿌려지게 되고, 각 단계에 의해서 하나의 좌표 시스템에서 다른 시스템으로 물체를 변환하는 과정이 이루어집니다.

1. 로컬 스페이스
 로컬 스페이스 모델링 스페이스라고도 불리며, 물체의 삼각형 리스트를 정의하는데 이용하는 좌표 시스템입니다. 3D상의 모든 물체는 고유의 로컬 좌표계를 가지며, 위치나 크기 월드 내의 다른 물체와의 관계 등을 고려하지 않고 모델을 구성 할 수 있습니다.

2. 월드 스페이스
 로컬 스페이스의 물체들을 월드 좌표 시스템으로 옮겨 하나의 장면을 구성하게됩니다. 각각의 물체는 이동, 회전, 크기 등을 포함하는 월드 변환을 통해서 월드 스페이스로 옮겨지게 됩니다. 월드 변환은 위치와 크기 방위을 포함하는 각 물체 간의 관계를 정의함으로써 이루어집니다.

3. 뷰 스페이스
 월드 스페이스 내에서 기하물체와 카메라는 월드 좌표 시스템과 연계되어 정의됩니다. 카메라의 위치를 월드 시스템의 원점으로 변환하고, 카메라의 양의 Z축을 내려다 보도록 회전시켜야 합니다. 이때 월드에 대한 관점이 바뀌지 않도록 하기 위해서는 카메라를 맞추어 월드 내의 모든 기하물체를 변환해야 하는데, 이와 같은 변환을 뷰 스페이스 변환이라 합니다. 변환을 거친 뒤의 기하물체는 뷰 스페이스 내에 위치한다고 말할 수 있습니다.

4. 후면 추려내기
 폴리곤은 두 개의 면을 가지고 있으며 하나의 면을 전면, 다른 면을 후면이라 부릅니다. 일반적으로 폴리곤의 후면은 절대 보여지지 않는데, 물체의 내부로 카메라를 넣는 것이 허용되지 않기 때문이죠. Direct3D에서는 두르기 순서의 시계 방향에 지정된 버텍스를 가진 폴리곤을 전면 폴리곤이라 하며, 시계 반대 방향에 지정된 버텍스를 가진 폴리곤을 후면 폴리곤이라 합니다.
( * 뷰 스페이스에서의 두르기 방향을 의미합니다. )

5. 조명
 광원은 월드 스페이스 내에 정의되지만 뷰 스페이스 변환에 의해 뷰 스페이스로 변환됩니다. 광원은 물체에 명암을 주는 역할을 하여 장면에 사실감을 더해줍니다. 광원은 크게 세가지가 있으며, Directional Light, Point Light, Spot Light가 있습니다.
첫번째로 Directional Light는 위치는 가지지 않지만 지정된 방향으로 평행하게 빛을 발산합니다. 
두번째 Point Light는 점광원이라 하며 월드 스페이스내에 위치를 가지며 모든 방향으로 빛을 발산합니다.
세번째 Spot Light는 손전등과 비슷하다고 볼 수 있는데요, 위치를 가지며 특정 방향으로 원뿔 모양으로 빛을 반산합니다. 

6. 클리핑
 클리핑은 시야 외부의 기하 물체를 추리는 단계입니다. 시야 절두체에서 삼각형의 위치는
세가지로 분류할 수 있는데요,
첫번째 완전한 내부입니다. 삼각형이 완전히 절두체 내부에 위치하면 그대로 보존되어 다음 단계로 진행합니다.
두번째는 완전한 외부입니다. 삼각형이 완전히 절두체 외부에 위치하면 추려내어집니다.
세번째는 부분적 외부입니다. 삼각형이 부분적으로 절두체 내부에 위치하면 삼각형을 두 개의 부분으로 분리하게 되는데요, 절두체 내부의 부분은 보존되고
나머지는 추려내어지게 됩니다.

7. 투영
투영은 n차원에서 n-1차원을 얻는 과정말합니다. 투영은 여러가지 방법이 있지만 원근 투영이라는 방법으로, 원근법을 이용하여 기하물체를 투사합니다.
즉, 카메라에서 멀리 떨어진 물체는 가까운 물체에 비해 작게 나타나게되지요. 이와 같은 투영은 3D장면을 2D 이미지로 표현하는데 있어 가장 적합합니다.
투영변환은 우리의 시야 볼륨인 절두체를 정의하고, 절두체 내에 속한 기하물체를 투영 윈도우에 투영하는 과정을 담당합니다. 

DirectX9에서 투영행렬을 구하는 함수로는 
1
2
3
4
5
6
7
D3DMATRIX* D3DXMatrixPerspectiveFovLH(
    D3DMATRIX *pOut,      // 투영행렬 리턴
    FLOAT fovy,           // 시야각의 수직 영역 ( 라디안 )
    FLOAT Aspect,         // 종횡비 ( 너비 / 높이 )
    FLOAT zn,             // 가까운 평면까지의 거리
    FLOAT zf              // 먼 평면까지의 거리
)
cs
투영 윈도우의 기하물체들은 결국 스크린 스페이스로 변환되는데, 정사각형에서 직사각형인 스크린으로의 변환에는 왜곡이 따르게 됩니다. 종횡비는 간단히 말해 화면 너비와 높이의 비율이며, 정사각형에서 직사각형으로의 매핑에 의해 발생하는 왜곡을 보정하는 역할을 합니다.


8. 뷰포트 변황
  뷰포트 변환은 프로젝트 윈도우의 좌표를, 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정을 말합니다.
게임에서의 뷰포트는 보통 직사각형의 전체 화면이 되지만, 윈도우 모드에서 실행하는 경우에는 클라이언트 영역이나 화면의 일부가 될 수 있습니다.

뷰포트 변환을 수행하는 행렬은 아래와 같습니다.
width / 2             0              0                     0
    0             -Height/2         0                     0
    0                 0           MaxZ - MinZ           0
x + width / 2    y + height/2      MinZ           1
width, height, x, y 데이터는 뷰포트를 포함하는 윈도우와의 상대적인 뷰포트 사각형을 정의합니다.
MinZ멤버는 최소 깊이 버퍼값을 지정하며, MaxZ는 최대 깊이 버퍼값을 정의합니다.
Direct3D는 0부터 1까지의 깊이 버퍼를 이용하므로, 특수한 효과를 원하는 것이 아니라면  MinZ와 MaxZ에도 이에 맞는 값을 지정해야합니다.


9.래스터라이즈
 스크린 좌표로 버텍스들을 변환한 다음에는 2D삼각형들의 리스트를 가지게 됩니다. 래스터라이즈 단계는 각각의 삼각형을 그리는 데 필요한 픽셀 컬러들을 계산하는 과정입니다. 엄청난 작업 양을 필요로 하므로 반드시 전용 그래픽 하드웨어에서 처리되어야하며,
래스터라이즈의 결과물은 모니터에 바로 디스플레이 할 수 있는 2D 이미지가 됩니다.