2024. 7. 16. 16:33ㆍDirectX12
· Vertex Shader
Input Assembler 단계에서 받은 정점들의 정보로 도형은 생성되었지만 공간 좌표계를 변환할 필요가 있다.
기본적으로 도형들은 자신만의 좌표계인 Local Space의 좌표를 가지는데, 모든 물체들이 하나의 월드에 위치하도록 Local Space에서 World Space로 변환하고, 실제 플레이어가 바라보는 카메라가 중심이 되는 공간인 View Space로 변환해준다.
그리고 마지막으로 Projection 변환을 거쳐서 최종적으로 투영까지 정의된 투영공간 Clip Space로 변환해준다.
최종적으로 변환과정을 나열하면 [오브젝트 공간] * 월드 변환 -> [월드 공간] * 뷰 변환 -> [카메라 공간] * 투영 변환 -> [클립 공간] 을 거치게 되는데 각각의 과정에 대해서 간략하게 설명하겠다.
월드 변환
각각 객체들은 지역공간(local space)라고도 불리는 오브젝트 공간은 3차원 세상에서 표현될 각각의 오브젝트들이 정의되어 있고 객체 중심(0, 0, 0) 의 좌표를 기준으로 각 정점들이 표현이 되어 한 객체를 이룬다. 이것은 월드 좌표상 절대적인 좌표가 아니라 상대적 좌표이므로 이 것을 월드상에 표시 할 때는 월드상의 좌표로 나타 낼 필요가 있다.
객체 좌표을 world space 기준으로 world transform 하면 첫 좌표 변환 성공이다.
카메라 변환
객체의 정보를 world space로 변환하는 과정을 성공했다면 이제 객체를 관찰하기 위해 카메라 좌표를 기준으로 변환 해야한다. 실제 세상에서 어떤 물체를 어떤 방향에서 바라보느냐에 따라 보이는 물체의 모양은 달라진다.
궁극적인 렌더링의 목표는 시점자를 기준으로 그 물체를 그려내는 것이기 때문에 시점자의 기준으로 해당하는 객체의 좌표를 변경해야 랜더링해야 그래픽스 알고리즘을 수행 할 수 있다.
가상의 카메라는 컴퓨터의 성능의 한계 때문에 실제 세상의 카메라와는 다르게 시야가 제한되어 있을 수밖에 없다. 이 떄 이 시야는 fovy(시야각), aspect(종횡비)에 의해 결정되는데 이러한 시야의 가시 영역을 뷰 볼륨(view volume)라고 부르고, 이렇게 생성된 뷰 볼륨은 n(근평면), f(원평면)에 의해 절단되어 View Frustum(절두체)의 영역으로 다시 정의된다.
[view volume]
[view frustum]
카메라 공간 내의 물체는 절두체 공간 밖에 있는 물체는 그리지 않게 되는데, 우리가 살고 있는 3차원의 카메라의 세상은 과 다르게 만약 물체(폴리곤)이 절두체의 경계에 걸치게 되면 바깥쪽에 있는 부분은 잘려져 버려지게 되는데 이를 클리핑이라고 한다. 이 클리핑은 카메라 변환에서 일어나지 않고 나중에 클립 공간에서 수행된다.
투영 변환
자 카메라 변환에서 월드의 모든 물체를 카메라 공간으로 이동시켰고, 이제 카메라 시점에서 세상을 바라 볼 수 있게 되었는데. 우리가 카메라를 통해 바라보는 가상의 세상은 현실 세계처럼 3차원 세상이지만 실제로 우리가 바라볼 모니터는 2차원의 평면이다. 3차원 공간을 2차원 공간에 그리기 위해 멀리 있는 물체일수록 작게, 멀리있는 물체일수록 소실점에 가깝게 그리면 된다.
투영 변환은 이러한 원근법을 구현하기 위해 카메라 공간에서 정의된 절두체를 축에 나란한 직육면체 볼륨으로 변경하여 카메라 공간의 모든 물체를 3차원 클립 공간으로 변환하는 것을 의미한다. 이러한 투영 변환을 거친 물체들을 관찰해보면 절두체 뒤쪽에 있던 영역의 폴리곤은 상대적으로 작아지는 것을 볼 수 있는데 우리가 원했던 원근법이 적용된 것이라고 볼 수 있다. 다시 정리하자면 투영변환은 3차원 공간 내에서 원근법을 실현한 것이다
그리고 하나 더 생각해야 할 것이 원근법을 3차원 공간에서 실현하기 위해 직육면체 볼륨으로 물체들을 변환시켰는데 여기서 부가적으로 얻게되는 이점이 있다. 바로 나중에 설명할 클리핑(clipping)에 관한 것이다. 아까 클리핑은 뷰 프러스트럼 바깥쪽의 폴리곤들을 잘라 내는 것이라고 설명하였는데 현재 투영 변환을 거치면서 절두체 공간이 직육면체의 클립핑 공간으로 변형되었다.
결론 Vertex Shader 과정은 무엇인가
2) Vertex Shader
- Input Assembler 단계에서 정점 데이터(프리미티브)를 입력 받아 공간 좌표계를 변환해준다.
- 기본적으로 도형들이 가지는 공간인 Local Space 좌표를 모든 물체들이 하나의 공간에 위치하도록 World Space 좌표로 변환하고, 실제 플레이어가 바라보는 카메라가 중심이 되는 공간인 View Space로 변환한 뒤, 투영을 통해 투영 공간인 Clip Space로 변환한다.
<공간 변환 순서 정리>
오브젝트 공간 -> M -> 월드 공간 -> V -> 카메라 공간 -> P -> 클립 공간 -> Cliping -> NDC
<공간 변환 과정>
- 공간 변환은 각각의 행렬 연산을 통해 이루어짐
- 변환 행렬은 총 3가지 -> Model, View, Projection
- M, V, P는 각각의 변환 행렬 이름이며, 변환 자체를 가리킴
모델변환, 시점변환 결과물체 좌표는 시점을 기준으로 표시.
이후에 이어지는 변환이 투상변환과 뷰포트 변환이다.
투상변환은 3차원 물체를 2차원 자막에 맺히도록 하기 위한 기본 작업
정확도를 강조하려면 평행투상, 원근감을 강조하려면 원근 투상을 사용
투상결과 물체에 대해 절단 작업이 가해진 후 최종적으로 뷰 포트 변환에 의해 2차원 화면으로 사상
*투상 (Projection)
- 3차원 물체를 2차원 투상면으로 사상하기 위한 작업(=가시변환, Viewing Transform)
- 투상중심(COP, Center of Projection) : 관찰자 위치(View Point, Eye Position, Camera Position)인 시점 좌표계 원점
- 투상선(Projectors) : 투상 중심으로부터 물체 곳곳을 향한 선들
- 시선(Line of sight) : 카메라가 바라보는 방향
-> 카메라 설정 방법에 따라 시선은 전역 좌표계 원점을 향하기도 하고, 임의 위치의 초점을 향하기도 한다.
- 투상면(Projection Plane, View Plane) : 물체 영상이 맺히는 역할, 일반적으로 시선에 수직
* 결국 투상 중심에서 물체 정점을 향한 투상선이 투상면과 만나는 곳에 해당 정점이 투상(Projection)된다.
1. 평행 투상(Parallel Projection)
: 시점이 물체로부터 무한대의 거리에 있다고 간주하여 투상선을 나란히 가져가는 방법,
평행 투상에서 원래 물체의 평행선은 투상 후에도 평행, 시점으로부터의 거리와는 무관하게 같은 길이의 물체는 같은 길이로 투상
1) 정사 투상(Orthographic Projection)
: 평면도(상하, Top/Bottom View), 입면도(전후, Front/Rear View), 측면도(좌우, Left/Right View)
-> 모델 좌표계 주측인 x, y, z에 의해 형성되는 x-y, y-z, z-x를 주 평면이라 하면, 정사 투상의 투상면은 주 평면 중 하나와 나란히 놓인다.
-> 정사 투상에서 투상선은 투상면과 직교한다.
투상면에 맺힌 모습이 원래 물체의 길이를 정확히 보존하기 때문에 정사 투상은 정확성을 요하는 공학 도면에 주로 사용.
투상선이 반드시 투상면과 직교해야 하므로 정사 투상에서의 시점 위치는 제한
2) 축측 투상(Axonometric Projection)
: 한꺼번에 여러 면을 보여준다. 투상선이 투사면과 직교한다는 점에서는 정사 투상과 같지만 투상면이 반드시 주평면들과 나란하지 않다.
-> 투상면이 임의의 위치에 놓일 때를 삼각(삼중형, Trimetric), 2개의 주 평면에 대해서 대칭적으로 놓일 때를 양각(이중형, Dimetric), 3개의 주 평면이 만나는 모서리에서 모든 평면에 대해 대칭적으로 놓일 때를 등각(동형, Isometric)
(a) 등각 투상 : 투상면은 세 개의 주 평면에 대칭인 곳에 놓인다. 이 경우 모서리 부근에서 3개의 주측이 서로 120도를 유지, 따라서 정삼각형의 단면은 그대로 정삼각형으로 투상
(b) 양각 투상 : 투상면이 2개의 주 평면에 대칭인 곳에 놓이므로 정삼각형의 단면이 이등변 삼각형으로 투상. 이 경우 3개의 주축이 이루는 각도는 2개만 동일
===>> 축측 투상의 결과는 일반적으로 물체의 실제 모습이 아니다. 즉, 실제 길이가 보존되지 않으며 각 축의 방향으로 서로 다른 축소율을 보인다.
세 축의 모두 서로 다른 축소율을 보이는 것이 삼각 투상이며, 두 축에 대해서 동일한 축소율을 보이는 것이 양각 투상,
세 축 모두 동일한 축소율을 보이는 것이 등각 투상.
3) 경사 투상(Oblique Projection)
: 투상선이 나란하다는 점에서 평행 투상, 투상선이 투상면과 직교하지 않는다.
투상면은 시선에 수직이지만 투상면의 위치가 그림처럼 좌우로 비켜서있다.
2. 원근 투상(Perspective Projection)
: 시점이 물체로부터 유한한 거리에 있다고 간주하여 모든 투상선이 시점에서 출발하여 방사선 모양으로 퍼져가는 방법, 카메라나 사람의 눈이 실제로 물체를 포착하는 방법. 크기가 동일한 물체라도 시점으로부터 멀면 작게 보이고, 가까우면 크게 보인다. 원근감이 나타난다.
'DirectX12' 카테고리의 다른 글
렌더링 파이프라인(6) - Pixel Shader(Fragment Shader) (1) | 2024.07.16 |
---|---|
렌더링 파이프라인(5) - Rasterization (0) | 2024.07.16 |
렌더링 파이프라인(4) - Geometry Shader (0) | 2024.07.16 |
렌더링 파이프라인(3) - Tessellation (0) | 2024.07.16 |
렌더링 파이프라인(1) - Input Assembly (1) | 2024.07.16 |