[ Graphics ] 변환
변환
GPU에서 렌더링 진행을 위해 렌더링 파이프 라인에 따라 정점 처리가 진행된다.
정점 쉐이더(vertex shader): 정점 배열의 모든 정점에 대한 연산 수행
레스터라이저(rasterizer): 연산된 정점들로 삼각형을 조립, 삼각형을 구성하는 픽셀, 프래그먼트(fragment)를 생성
프래그먼트 쉐이더(fragment shader): 라이팅과 텍스처링 등의 작업을 통해 색상을 결정한다
출력병합기(output merger): 결정된 색상을 출력한다
이중 정점 쉐이더와 프래그먼트 쉐이더는 소프트웨어로 변형이 가능하고 레스터라이저와 출력병합기는 하드웨어로 고정되어, 정해진 연산과 기능만을 수행한다.
정점 쉐이더
1. 변환 연산
정점 쉐이더에서 3차원 모델을 이미지로 출력하기 위해 변환 연산을 진행한다. 변환(transform)은 이동(translation), 회전(rotation), 축소확대(scaling)로 구성된다.
1) 2차원 변환
축소확대와 회전은 선형 변환(linear transform)으로 행렬-벡터곱을 통해 표현할 수 있다. 회전은 임의의 회전 중심을 통해 회전 변환을 진행한다.
이동은 변위 벡터(displacement vector)를 통한 벡터 덧셈으로 구현된다.그러나 동차 좌표(homogeneous coordinates) 사용 시, 이를 행렬 곱셈으로 구현할 수 있다.
2) 3차원 변환
3차원에서의 축소확대와 이동 변환은 2차원과 같다.
3차원의 회전은 회전축(axis of rotation)을 필요로 한다.
3) 결합 변환
결합 변환은 다중의 변환이 발생하는 것으로, 2차원 결합 변환에서 이동,회전을 포함하는 경우, 임의의 점을 중심으로 회전 시, 먼저 원점으로 이동하여 회전 후 다시 이동한다. 3차원도 같은 방법을 사용한다.
선형 변환이 아닌 이동과 선형 변환인 축소확대, 회전을 포함한 결합 변환을 아핀 변환(affine transform)이라고 하며, 축소확대 없이 회전과 이동이 결합된 변환은 강체 변환(rigid transform)이라고 한다.
2. 월드 변환
하나의 물체가 모델링되면 이 모델은 오브젝트 공간(object space)이라는 개별 좌표계를 가진 공간에 존재한다. 여러 개의 모델을 하나의 공간에서 생성하기 위해서는 이러한 개별 좌표계를 통합하여 월드 공간(world space)을 생성해야 되는데 이러한 과정을 월드 변환(world transform)이라고 한다.
초기 모델링 시 각 모델의 기저(bias)는 같으나 물체가 회전하며 모델의 개별 기저가 달라진다. 이를 초기 기저 ($e_1$,$e_2$,$e_3$)와 회전 후 기저 (u,v,n)으로 표현할 수 있다.
이를 역변환(inverse transform)을 통해 기저를 일치시킨다.
그래서 월드 공간의 기저, 오브젝트 공간의 기저를 나타내며, 이를 역변환을 통해 월드 변환을 사용한다.
월드 변환 시, 노말은 정점과 같은 행렬L로 변환 시, 비균등 축소확대로 인해 값의 변화가 발생한다. 그래서 $L^{-T}$를 사용하여 변환한다.
이러한 과정을 통해 모델을 오브젝트 공간에서 월드 공간으로 변환시킨다.
2. 카메라 변환
3D 월드 공간에 위치한 물체들을 2D 이미지로 출력하기 위해 3D 공간에서 특정 위치에서 특정 영역을 바라보는 ‘눈’이 필요하다. 가상 카메라를 활용, 위치와 방향을 설정한다.
- eye : 월드 공간에서의 카메라 위치
- at : 월드 공간에서 카메라의 시점
- up : 카메라의 상단
이들을 통해 카메라 공간(camera space)가 정의되며 공간의 원점은 eye에 위치한다.
월드 공간에 위치한 모델을 원하는 영역에 찍기 위해 카메라 영역으로 옮기기 위해 공간 이전(space change)를 위해 두 좌표계를 일치시키는 과정을 한다. 이를 위해 eye를 o로 이동 후 회전하며, 이 과정에서 모델은 카메라 좌표계를 따라 같이 움직인다.
회전 변환을 통해 기저를 일치시키는 것을 월드 공간의 모든 물체에 적용한다.
이러한 기저 이전(basis change) 과정을 뷰 변환(view transform) 또는 카메라 변환(camera transform)이라고 한다.
3. 투영 변환
일반적으로 출력할 수 있는 이미지의 크기는 한정되어있어 공간의 모든 것을 스크린에 담을 수 없다. 이로 인해 시야(field of view; fov)에 따른 뷰 볼륨(view volume)을 설정한다.
- fovy : field of view y-axis y축 기준 시야각
- aspect : 뷰 볼륨의 종횡비(width/height)
- near plane : 전방 평면
- far plane : 후방 평면
이를 통해 뷰프러스트럼(view frustrum) 또는 절두체를 구성한다.
이 공간에 들어오지 못한 물체는 렌더링 되지 않고 GPU 파이프라인에 들어가지 못한다. 이러한 것을 culling된다.
그리고 이를 투영변환 (projection transform)한다. 이는 피라미드 모양의 절두체를 2X2X2 정육면체로 변환하는 것으로, 원근법을 적용한다. 이러한 과정을 통해 생성하는 공간을 클립 공간(clip space)이라고 한다.
뷰 프러스트럼은 투영선(projection lines)의 집합 3차원 공간에서는 l1이 l2보다 길지만 투영 평면에서 동일한 길이를 같게 되면서 원근법을 구현한다. 이러한 과정은 정점 쉐이더가 수행하는 마지막 연산으로 이를 마치고 레스터라이저에 입력된다.
출처: OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문