#2. 렌더링 파이프라인 변환
*로컬스페이스 -> 월드스페이스의 변환
-> 처음 오브젝트의 위치를 정해주면 해당 오브젝트는 로컬스페이스를 가지게 된다.
이는 상대 위치고 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까지 깊이버퍼를 사용함(특수한 효과를 제외하고)
전체적인 렌더링 파이프 순서는
로컬스페이스 -> 월드스페이스 -> 뷰스페이스 -> 후면추려내기
-> 조명 -> 투영 -> *클리핑 -> 뷰 포트 -> 래스터라이즈
로 알 수 있다.
*용책에는 클리핑 순서가 투영 이전으로 되어 있지만, 클리핑은 시야 볼륨 외부의 기하물체를 추려내는 작업이다.
이때, 시야 볼륨이라는 것은 절두체를 의미하는데, 이 절두체는 투영 과정에서 만들어 진다.
절두체가 생성 되어 있어야, 클리핑이 가능하므로
투영이후 클리핑 이라고 볼 수 있다.
*해골책에는 투영 이후 클리핑 이라고 나와 있다.