728x90
반응형

랜더링 파이프라인

- 3D 세계에 대한 기하학적 표현과 이 세계를 바라보는 관점을 정의하는 가상 카메라를 이용해 2D 이미지를 만들어내는 역할을 담당한다.

 

 

[ 파이프라인]

 파이프 라인 내에서의 몇 가지 단계에 의해 하나의 좌표 시스템에서 다른 시스템으로 기하물체를 변환하는 과정이 이루어진다. 이 변환에는 행렬이 이용되고, 변환 과정은 Direct3D의 책임 하에 이루어진다. Direct3D 변환을 이용하기 위해서는 우리가 원하는 변환 행렬을 지정해야하며, IDirect3DDevice->SetTransform 매서드를 이용해 행렬을 전달할 수 있다.

 

1. 로컬 스페이스 ( 모델링 스페이스 )

 - 물체의 삼각형 리스트를 정의하는 데 이용하는 좌표 시스템이며, 모델링 과정을 쉽고 단순하게 만들어준다. 위치나 크기, 월드 내의 다른 물체와의 관계 등을 고려하지 않고도 모델을 구성할 수 있다. ( 그 특정 모델만을 위한 좌표계)

 - 상대적인 공간이다.

 

 

2. 월드 스페이스

 - 로컬 스페이스의 물체들이 이동, 회전, 크기 변형 등을 포함하는 월드 변환이라는 작업을 거쳐 월드 스페이스로 옮겨진다. 

 - 절대적인 공간 ( 원점이 정해져 있고 변하지 않는다.)

 

로컬 스페이스 -> 월드 스페이스

   Device->SetTransform(D3DTS_WORLD, &worldMatrix); 

 

3. 뷰 스페이스

 - 월드에 대한 관점이 바뀌지 않도록 하기 위해서는 카메라에 맞추어 월드 내의 모든 기하물체를 변환해야 하는데, 이 와 같은 변환을 뷰 스페이스 변환이라고 하며, 이 변환을 거친 뒤의 기하물체는 뷰 스페이스 내에 위치한다고 말할 수 있다.

 - 왜 카메라를 원점으로 맞추었을까? 

   3D와 2D의 차이점은 깊이를 표현할 수 있냐 없냐의 차이인데, 여기서 깊이는 카메라 기준으로 한다. 카메라를 z축 양의 방향을 바라보도록 했을 때, 각 사물들이 갖고 있는 z축이 깊이가 된다. (이 때 필요한 행렬은 뷰 행렬이다.)

 -  뷰 스페이스를 완성했을 때 카메라는 어떤 상태를 가질까?

   뷰 스페이스는 카메라를 항등상태로 만들기 때문에 항등행렬이 나온다.  A라는 행렬이 있을 때 A의 역행렬을 곱하면 항등행렬이 나온다. 그러므로 뷰 행렬은 카메라의 역행렬이다.

( ※ 카메라 크기는 키우면 안됨! 크기는 무조건 1이어야한다. 단위벡터)

 

 

월드 스페이스 -> 뷰 스페이스

   Device->SetTransform(D3DTS_VIEW, &V);

 

4.  후면 추려내기

 - 폴리곤은 두 개의 면을 가지고 있으며 하나의 면을 전면, 다른 면을 후면이라 부른다. 일반적으로 폴리곤의 후면은 절대 보여지지 않는데, 이는 장면 내의 박스나 원기둥, 탱트, 캐릭터 등과 같은 채워진 볼륨이며, 채워진 물체의 내부로 카메라를 넣는 것이 허용되지 않기 때문이다.

-  전면을 향하고 있는 폴리곤들이 뒤쪽의 후면 폴리곤들을 가리는데 , Direct3D는 후면 폴리곤을 추려냄으로서 (이후의 처리에서 제거) 상당한 이득을 취한다. 이를 후면 추려내기라 한다.

- 디폴트로 Direct3D는 두르기 순서의 시계 방향에 ( 뷰 스페이스에서) 지정된 버텍스를 가진 폴리곤을 전면 폴리곤으로 취급하면, 두르기 순서의 시계 반대 방향에 지정된 버텍스를 가진 폴리곤을 후면 폴리곤으로 취급한다.

 

상태 수정하여 동작 변경

Device->SetTransform(D3DRS_CULLMODE, D3DCULL_NONE);      // 후면 추려내기를 완전히 끈다.

Device->SetTransform(D3DRS_CULLMODE, D3DCULL_CW);         // 시계 방향 두르기를 가진 삼각형을 추려낸다.

Device->SetTransform(D3DRS_CULLMODE, D3DCULL_CCW);       // 시계 반대 방향 두르기를 가진 삼각형을 추려낸다.(디폴트)

 

5. 조명

- 광원은 월드 스페이스 내에 정의되지만 뷰 스페이스 변환에 의해 뷰 스페이스로 변환된다.

- 광원은 물체에 명암을 추가하여 장면에 사실감을 더해준다.

 

 

6. 클리핑

 - 시야 볼륨 외부의 기하물체를 추려내는 과정클리핑이라 한다.

 - 시야 볼륨은 절두체이다. 

 - 완전한 내부 - 삼각형이 완전히 절두체 내부에 위치하면 그대로 보존되어 다음 단계로 진행한다.

 - 완전한 외부 - 삼각형이 완전히 절두체 외부에 위치하면 추려내어진다.

 - 부분적 내부( 부분적 외부 ) - 삼각형이 부분적으로 절두체 내부에 위치하면 삼각형을 두 개의 부분으로 분리한다. 절두체 내부의 부분은 보존되며, 나머지는 추려내어진다.

 

 

7. 투영

 - 뷰 스페이스에서는 3D 장면의 2D 표현을 얻는 과정이 남아있다. 이와 같이 n 차원에서 n - 1 차원을 얻는 과정투영(projection)이라 한다. 

 - 원근 투영(perspective projection) : 원근법을 이용하여 기하물체를 투사한다. ( 카메라에서 멀리 떨어진 물체는 가까운 물체에 비해 작게 나타난다.) 3D 장면을 2D 이미지로 표현하는 데 가장 적합하다. 

 - 투영 변환은 우리의 시야 볼륨(절두체)을 정의하고, 절두체 내의 기하물체를 투영 윈도우에 투영하는 과정을 담당한다.

- 투영 스페이스는 절두체를 정규화(백분율) 시켜놓은 공간이다. 

 

투영행렬을 얻기 위해서는 

Device->SetTransform(D3DTS_PROJECTION, &proj);

 

8. 뷰포트

뷰포트 변환프로젝트 윈도우의 좌표를 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정을 말한다.

 - 뷰포트 사각형은 이를 포함하고 있는 윈도우와 상대적이며, 윈도우 좌표를 이용해 지정된다.

 

 Device->SetViewport(&vp);

 

9. 래스터라이즈

 - 각각의 삼각형을 그리는 데 필요한 픽셀 컬러들을 계산하는 과정이다. 

 - 래스터라이즈 과정은 엄청난 작업 양을 필요로 하므로 반드시 전용 그래픽 하드웨어에서 처리되어야 한다.

 

728x90
반응형

'DirectX > DirectX9' 카테고리의 다른 글

알파 블랜딩 관련 참고  (0) 2023.04.07
조건부 컴파일 사용  (0) 2021.07.08
행렬 함수  (1) 2021.07.06
벡터의 내적을 이용한 사각형 회전  (1) 2021.07.06
D3DXVec3TransformNormal / D3DXVec3TransformCoord  (0) 2021.07.06

+ Recent posts