[GPU] Coordinate System (좌표 변환 순서)

Graphic API를 사용해서 이미지를 Rendering 하면 여러 연산 과정을 거치게 된다. 그중 Vertex Shader 연산은 물체(Object)의 좌표값을 계산하는 작업을 수행한다. 좌표 계산을 위해서 여러 번의 Transform(변환) 연산을 수행한다. 이번 글에서는 좌표의 변환 순서에 대해서 정리할 예정이다.

MK: 예전에는 Vertex 연산 과정에서 Light 등을 고려해서 색상을 결정하는 연산도 같이 수행하였다고 한다. 그래서 Vertex Shader 라는 이름이 지어졌다고 한다. 출처 2에서 글을 따르면 Shader라는 이름은 색상을 결정하는 단계에서 쓰이는 이름인 것 같다.

그림 1: 좌표 변환 순서 (출처 1)

위 그림 1은 Object의 좌표를 변환하는 순서를 보여준다. 보통 글을 쓸 때 그림을 다시 그리지만, 출처 1에서 제공하는 그림만큼 잘 그릴 자신이 없어서 그대로 사용하였다. 각 Object의 Local Space 좌표값을 기준으로 우리가 보이는 Screen Space까지 총 5단계의 좌표 변환(Transform)을 수행한다. 그중 View Space까지 보통 Vertex Shader에서 연산을 수행하고 나머지 단계를 GPU Fixed-Function에서 계산하는 것으로 추측된다.

Local Space (Model Space) (출처1): 디자이너(?)가 Object를 만들게 되면 (0, 0, 0)을 기준으로 디자인을 하게 된다. 예를 들어서 Cube를 디자인하는 경우 Cube를 (0, 0, 0) 기준으로 디자인 하게 된다. 하지만, Cube가 실제로 그려지는 위치는 항상 달라진다. 이렇게 최초로 Object를 생성하는 단계에 사용되는 공간을 Local Space라고 한다.

World Space (출처 1): 여러 개의 Object를 Import 하여서 위치를 정하는 단계이다. 예를 들어 여러 개의 집을 그려서 하나의 마을은 Rendering 한다고 가정하면 여러 개의 집의 위치가 다르고, 집이 향하는 방향도 다르게 되고, 각 집의 크기도 다르다. 이렇게 크기(Scale), 위치(Translate), 방향(Rotate)들을 조절하여서 여러 개의 Object를 그린 공간을 World Space라고 한다. 하나의 Object (Local Space)를 World Space로 변경하기 위해서 사용하는 Matrix를 Model Matrix라고 한다.

View Space (Camera Space, Eye Space) (출처 1): View Space는 User(사용자)가 바라보고 있는 공간을 의미한다. 여러 개의 물체를 World Space로 변경 후 User가 있는 위치에서 물체를 바라보는 시점을 의미한다. 쉽게 이해해서 마을을 구성한 World Space에서 해당 마을(건물)을 바라보고 있는 공간을 의미한다. 예를 들어서 특정 집 앞에서 다른 집을 바라보는 시점이 될 수도 있고, 비행기를 타고 위에서 마을을 바라보는 시점이 될 수도 있다. 이렇게 World Space를 View Space로 변경하기 위해서 View Matrix를 사용한다.

Clip Space (출처 1): 이 부분은 Vertex Shader 연산에서 수행하지 않는다. Vertex Shader 연산이 완료되면 GPU Fixed Function을 사용해서 연산을 수행한다. Clip Space는 최종적으로 화면에 출력되는 View의 크기로 Object를 잘라낸 후의 좌표를 의미한다. 모니터에 출력되지 않는 물체는 Clip 되어서 없어지게 된다. 만약 물체의 일정 부분만 표시되는 경우 해당 물체를 잘라서 필요 없는 부분을 제거한다. 추가로 해당 Space는 NDC (Normalized Device Coordinates)를 사용한다. NDC는 Coordinate(좌표)를 -1.0과 1.0 사이로 변경한 값을 의미한다. View Space를 Clip Space로 변경하기 위해서는 Viewport(화면에 표시되는 크기)와 Projection Matrix가 필요하다.

Screen Space: 이 부분은 실제로 화면에 출력되는 Space를 의미한다. Clip Space는 NDC를 사용해서 3D 좌표를 -1.0과 1.0 사이로 변경한다. Screen Space는 Clip Space를 모니터에 표시되는 Pixel(Fragment)로 변경한 후의 Space를 의미한다. 예를 들어 우리가 1080P의 화면에서 게임을 하는 경우 총 1,920 X 1,080개의 Pixel로 구성되어 있다. Screen Space는 해당 Pixel을 사용해서 화면에 표시되는 Space를 의미한다. 아마도 Clip Space는 GPU의 Rasterization 과정을 거치면서 Screen Space로 변경되는 것으로 추측한다.

출처

  1. https://learnopengl.com/Getting-started/Coordinate-Systems
  2. Real-Time Rendering (Fourth Edition)

Leave a Comment