SR

#2. 렌더링 파이프라인 변환

HYuk 2021. 9. 13. 18:04
728x90

*로컬스페이스 -> 월드스페이스의 변환

-> 처음 오브젝트의 위치를 정해주면 해당 오브젝트는 로컬스페이스를 가지게 된다.

이는 상대 위치고 3D모델만은 위한 좌표계 이다.

 

로컬스페이스를 월드스페이스로 옮겨주어 하나의 장면을 구성해야 하는데,

 

월드 변환은 위치, 크기, 방위를 포함하는 각 물체간의 관계를 정의함으로써 이루어 진다.

 

D3DXMatrixTranslation(&매트릭스, 좌표1, 좌표2, 좌표3);

pDevice -> SetTransform(D3DTS_WORLD, &매트릭스);

를 이용하여 해당 월드 좌표로 이동시켜 줄 수 있다.

 

*월드스페이스 -> 뷰스페이스의 변환

->뷰 스페이스는 카메라가 원점인 공간이다.

 

카메라가 월드 좌표 시스템과 연계되어 정의되는데,

 

카메라가 월드내 임의 위치나 방위를 가진다면 투영이나 그 밖의 작업이 비효율적이 된다.

 

따라서 카메라를 월드의 원점으로 변환하고 카메라가 z축의 양의방향을 바라보는 형태로 회전시켜 주어야 한다.

 

이때, 카메라의 관점이 변하기 않도록 월드내의 모든 오브젝트들을 똑같이 변환시켜주어야 한다.

 

이 변환을 거친 뒤의 오브젝트들은 뷰 스페이스내에 위치한다고 말할 수 있다.

 

D3DXMatrixLookAtLH(&매트릭스, &(월드상의)카메라위치, &(월드상의)카메라가 보는 지점, &(월드상의) 업 벡터 (보편적으로 y축이다.));

pDevice -> SetTransform(D3DTS_VIEW, &매트릭스);

 

이 뷰 행렬 이라는 것은 카메라를 항등행렬로 만드는 것이다.

항등행렬로 만들기 위해서

Right Up Look Pos 를 세팅하여 역행렬을 구하고

역행렬을 곱해주어 항등행렬로 만드는 것이다.

 

*후면추려내기 과정

버텍스로 그려진 폴리곤이 어디가 전면이고 후면인지 파악하여 폴리곤의 후면을 처리하여 보이지 않게 하는 과정이다.

이때 디폴트로 시계방향으로 그려진것이 전면, 반시계방향이 후면인데

D3DRS_CULLMODE로 렌더 상태를 수정하여 선택적으로 사용 할 수도 있다.

 

pDevice -> SerRenderState(D3DRS_CULLMODE, 값);

값 :

D3DCULL_NONE  = 후면 추려내기를 끈다.

D3DCULL_CW = 시계 방향 두르기를 후면 취급 한다. (시계 방향을 그리지 않는다.)

D3DCULL_CCW = 시계 반대 반향 두르기를 후면 취급 한다. (시계 반대 방향을 그리지 않는다.) Default 상태 값이다.

 

*조명

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

 

*클리핑

시야 볼륨 외부의 기하물체를 추려내는 것이다.

 

시야 내부에 있으면 그대로 보존하고,

시야 외부에 있으면 추려내고,

시야에 부분적으로 있으면 부분적으로 추려내게 된다.

 

*투영

3D 장면을 2D로 표현

즉, n차원에서 n-1차원을 얻는 과정이다.

 

투영을 할거면 절두체가 세팅되어 있어야 한다.

투영스페이스는 절두체를 정규화 시켜놓은 공간이다.

x : -1 ~ 1

y : -1 ~ 1

z : 0 ~1

->z가 0 ~ 1 인 이유는 카메라는 뒤를 볼 수 없기 때문

 

원근투영(Perspective Projection)을 사용하여 멀리 떨어진 물체는 가까운 물체에 비해 작게 나타난다.

-> 일반적인 3D게임

직교투영은 거리와 관계없이 크기가 같다. (UI 찍어낼 때 많이쓴다.)

-> 모두의 마블, 모뉴먼트 밸리 등

 

D3DXMatrixPerspectiveFovLH(&매트릭스, 시야각(라디안), 종횡비(너비/높이), 가까운평면까지 거리, 먼 평면까지 거리);

p_Device -> SetTransform(D3DTS_PROJECTION, &매트릭스);

 

*뷰포트 변환

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

즉, 창안에 창을 만들어서 그 창에 출력시켜주는 것이다.

이때 좌표를 윈도우 좌표계를 사용한다.

 

D3DVIEWPORT9 vp = {시작점X, 시작점Y, 너비, 높이, 최소깊이버퍼, 최대깊이버퍼};

pDevice -> SetViewport(&vp);

=> Direct3D는 0부터 1까지 깊이버퍼를 사용함(특수한 효과를 제외하고)

 

 

전체적인 렌더링 파이프 순서는

로컬스페이스 -> 월드스페이스 -> 뷰스페이스 -> 후면추려내기

-> 조명 -> 투영 -> *클리핑 -> 뷰 포트 -> 래스터라이즈

 

로 알 수 있다.

 

*용책에는 클리핑 순서가 투영 이전으로 되어 있지만, 클리핑은 시야 볼륨 외부의 기하물체를 추려내는 작업이다.

이때, 시야 볼륨이라는 것은 절두체를 의미하는데, 이 절두체는 투영 과정에서 만들어 진다.

절두체가 생성 되어 있어야, 클리핑이 가능하므로

투영이후 클리핑 이라고 볼 수 있다.

*해골책에는 투영 이후 클리핑 이라고 나와 있다.

 

728x90