기하학적으로 3D 장변을 구성하고 가상 가메라를 설정한 뒤에는 모니터에 2D 표현을 만들어내 는 과정 을 수행해야 한다. 이와 같은 일련의 과정을 렌더링 파이프라인이라고 한다.
파이프라인 내에서 몇 가지 단계에 의해 하나의 좌표 시스템에서 다른 시스템으로 기하물체를 변환하는 과정이 이루어지는데 이 변환과정에서 행렬이 이용된다.
이 때, 하드웨어 변환 기능을 가진 하드워l 어를 보유하고 있다면 그래픽 하드웨어 내에서 변환을 처리할 수 있다. Direct3D 변환을 이용하기 위해서는 우리가 원하는 변환 행렬을 지정해야 하며, IDirect3DDevice->SetTransform 메서 드를 이용해 행렬을 전달할 수 있다.
예시
Device->SetTransform(D3DTS_WORLD, &worldMatirx);
- 로컬 스페이스
모델링 스페이스라고도 불리는 로컬 스페이스는 우리가 물체의 삼각형 리스트(버텍스리스트)를 정의하는데 이용하는 좌표 시스템이다.
- 월드 스페이스
자체의 로컬 좌표 시스템 내에 다수의 모텔을 구성한 다음에는 이를 전역(월드) 좌표 시스템으로 옮겨 하나의 장면을 구성해야 한다. 로컬 스페이스의 물체들은 이동, 회전, 크기 변형 등을 포함하는 월드 변환이라는 작업을 거쳐 월드 스페이스로 옮겨진다.
- 뷰 스페이스
카메라가 월드 내 임의의 위치나 방위를가진다면 투영이나 그 밖의 작업이 어렵거나 덜 효율적이 된다. 따라서 작업의 수월함을 위해 카메라를 월드 시스템의 원점으로 변환하고, 카메라가 양의 z축을 내려다보도록 회전시켜야 한다. 이때 월드에 대한 관점이 바뀌지 않도록 하기 위해서는 카메라에 맞추어 월드 내의 모든 기하물체를 변환해야 하는데, 이와 같은 변환을 뷰스페이스 변환이라 하며, 이 변환을 거친 뒤의 기하불체는 뷰 스페이스 내에 위치한다고 말할 수 있다.
- 후면 추려내기(Backspace Culling)
메쉬, 혹은 폴리곤, 버텍스로 이루어진 삼각형 등이 있을때 후면을 그리지 않는것을 의미한다. Direct3D는 후면 추려내기로 인해 상당한 이득을 본다. ( 덜 그려주기 때문)
- 조명
광원은 월드 스페이스 내에 정의되지만 뷰 스페이스 변환에 의해 뷰 스페이스로 변환된다. 광원(조명)은 물체에 명암을 추가해서 장면에 사실감을 더해준다.
- 클리핑
시야 볼륨 외부의 기하물체를 추려내는것을 클리핑이라고 한다. 시야 절두체에서의 삼각형 위치는 다음과 같이 분류힌다.
1. 완전한 내부 - 삼각형이 완전전히 절두체 내부에 위치하면 그대로 보전하여 다음단계로 진행
2. 완전한 외부 - 삼각형이 완전히 절두체 외부에 위치하면 추려냄
3. 부분적 내부 - 삼각형이 부분적으로 절두체 내부에 위치하면 삼각형을 두개의 부분으로 분리한다. 절두채 내부 부분은 보존하고 외부는 추려낸다.
- 투영
뷰 스페이스에서는 3D 장변의 2D 표현을 얻는 과정이 남아있다. 이와 같이 n 차원에서 n-1 차원을 얻는 과정을 투영
(projection) 이라 한다. 원근 투영(perspective projection) 이라는 방법으로, 원근 투영은 원근법을 이용하여 기하물체를 투사한다. 즉, 카메라에서 멀리 떨어진 불체는 가까운 물체에 비해 작게 나타난다.
종횡비 인자를 계산하기 위해서는 약간의 작업이 필요하다. 투영 윈도우의 기하물체들은 결국 스크린 스페이스(2.3 .8 섹션 참고)로 변환되는데, 정사각형(투영 윈도우)에서 직사각형인 스크린으로의 변환에는 왜콕이 따르게 된다. 종횡비는 간단히 말해화변 너비와 높이의 비율이며, 정사각형에서 직사각형으로의 매핑에 의해 발생하는왜곡을 보정하는 역할을 한다.
종횡비 = 화면 너비/화면 높이
- 뷰포트 변환
뷰포트 변환은 프로젝트 윈도우의 좌표를 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정을 말한다. 게임에서의 뷰포트는 보통 직사각형의 전체 화면이 되지만, 윈도우 모드에서 실행하는 경우에는 클라이언트 영역이나 화면의 일부가 될 수도 있다. 뷰포트 사각형 은 이 를 포함하고 있는 윈도우와 상대적이며, 윈도우 좌표를 이용해 지정된다.
- 래스터라이즈
스크린 좌표로 버텍스들을 변환한 다음에는 2D 삼각형들의 리스트를 가지게 된다. 래스터라이즈 단계는 각각의 삼각형을 기리는데 필요한 픽셀 컬러들을 계산하는 과정이다. 래스터라이즈 과정은 엄청난 작업 양을 필요로 하므로 반드시 전용 그래픽 하드웨어(GPU)에서 처리되어야 한다. 래스터라이즈까지 끝난 결과물은 바로 모니터에 디스플레이 할수 있는 2D이미지가 된다.
※해당 글은 DirectX 9를 이용한 3D Game 프로그래밍 입문 책을 참고했습니다.
'그래픽스 > DirectX' 카테고리의 다른 글
버텍스/인덱스 버퍼 (0) | 2024.05.09 |
---|---|
깊이 버퍼(depth buffer) (0) | 2024.05.08 |
스왑 체인과 플리핑(SwapChain, Flipping) (0) | 2024.05.07 |
DirectX 기초 (1) | 2024.05.07 |
TexAssemble.exe 활용 큐브맵 dds 만드는 법 (0) | 2024.05.06 |
댓글