DirectX 11 - Vertex Shader
Input Assembler에서 정점정보들로 생성된 도형은 받았지만 로컬 좌표계(Local)에 있기 때문에 해당 데이터들을 화면에 그대로 출력해 버리면 화면에 중심부에 전부 그대로 출력되어 버려서 공간좌표계(World)로 변환할 필요가 있습니다.
Local Space에서 World space로 변환이 필요하고, 실제 플레이어가 바라보는 카메라가 중심이 되는 공간 View Spcae변환을 해준다. 그리고 마지막으로 Projection 변환을 거쳐 최종적으로 정의된 Clip Space라는 공간으로 변환을 해준다.
[월드공간 변환]
Local Space라고도 불리는 오브젝트 공간은 3차원 세상에서 표현될 각각의 개인의 공간에 정의된 영역입니다.
그러한 오브젝트를 월드 공간에 생성하여 월드공간으로 변환해야 합니다.
[카메라 공간 변환]
월드 변환이 완료되어 모든 물체가 한공간(World space)에 모아지면 이제 우리가 원하는 시점에서 물체를 관찰할 수 있게 해줘야 합니다. 이때 관찰자로서 가상의 카메라가 필요하고, 이 카메라가 볼 수 있는 영역의 공간을 뷰 공간이라고 합니다.
여기서 카메라가 바라보는 공간에 대해서 정의하고 넘어가야 합니다.
현실 세상은 모든 세상이 렌더링되어 있습니다.
하지만 현실적으로 컴퓨터로 모든 세상을 렌더링 할 수는 없습니다.
그래서 FOV(시야각), ASPECT(종횡비)에 의해 결정되는데 이러한 가시영역을 뷰 볼륨(View Volume)이라고 합니다.
이렇게 생성된 뷰 볼륨은 Near, Far 정보가 전달되어 전달된 절두체의 영역을 다시 정의합니다.
Near은 카메라가 볼 수 있는 가장 짧은 거리, Far은 카메라가 볼 수 있는 가장 먼 거리 입니다.
v1, v2가 같은 곳에 투사 되었다면, 두 포인트의 z 값을 비교해 어떤 포인트를 가시화할 것인지 결정합니다.
[View Frustrum]
위에서 설명한대로 컴퓨터는 모든 세상을 렌더링 할 수는 없기 때문에 절두체의 영역에 들어온 공간만 렌더링 해서 보여주게 되는데 이러한 작업을 클리핑(Clipping)이라고 합니다.
클리핑은 카메라 변환에서 이루어지지 않고 클립공간 -> 레스터라이저로 넘겨질 때 수행됩니다.
[투영 변환]
카메라 변환에서 월드 공간의 모든 물체를 카메라 공간으로 재배치하고, 이제 카메라 시점에서 세상을 바라볼 수 있게 되었습니다.
게임 속의 공간은 3차원이지만 우리는 화면을 통해서 2차원으로 같은 공간을 바라보게 됩니다.
3차원 공간을 2차원 평면에 표현하는 방법은 대표적으로 원근법이 있습니다.
투영 변환은 이러한 원근법을 적용하기 위해 카메라 공간에서 정의된 절두체를 3차원 클립공간으로 변환하는 것을 의미합니다.
투영 변환이라는 이름과는 다르게 3차원 공간의 물체를 2차원 평면으로 바꾸는 것이 아니라 3차원 물체로 변형됨에 주목해야 합니다.
이러한 투영 변환을 거친 물체들을 관찰해보면 절두체 뒤에 있던 영역의 폴리곤은 상대적으로 작아지는데 이것이 원근법이 적용된 것입니다.
원근법을 실현하기 위해 직육면체 볼륨으로 물체를 변환시키는데 이렇게 하면 간단한 공식으로 Clipping(클리핑) 작업을 할 수 있습니다.