본문 바로가기
Computer Science/Computer Graphics

Rendering Pipeline, Transformation Pipeline

by Gofo 2021. 4. 7.

Coordinate System and Reference Frame

Coordinate system과 reference frame은 유사한 개념으로 혼용되어 사용하기도 한다.

 

Coordinate system

Unique한 점의 위치를 표현하기 위해서 한 개 이상의 숫자를 사용하는 system이다.

수학적인 개념으로, 어떤 관찰된 점의 위치를 표현하기 위한 language이다.

즉, 각 reference frame에서 일어나는 움직임을 표현하고 관찰하기 위한 language이다.

 

예를 들어, cartesian coordinate system는 (x, y, z) 3개의 숫자를 이용해서 위치를 표현한다.

 

Reference frame

Abstract coordinate system + physical reference point

물리적인 개념으로 움직임의 상태를 표현한다.

 


Global/Local Coordinate System(Frame)

Global Coordinate System (Global Frame)

= World coordinate system

= Fixed coordinate system

 

모든 물체가 세상의 어딘가에 붙어있다고 생각한다.

모든 object를 표현하는 coordinate system이다.

 

Local Coordinate System (Local Frame)

각 움직이는 object마다 존재하는 coordinate system

 

아래 사진에서 왼쪽은 world frame과 local frame이 동일한 상황이다.

그러나 오른쪽에서 local frame이 동일하게 유지되지만 world frame은 달라졌다.

World frame and local frame

 


Rendering Pipeline

3차원 공간에 물체를 그리고 움직이더라도 결국에는 2D로 변환해서 화면에 표현해야 한다.

이러한 과정을 rendering pipeline(graphics pipeline)이라 한다.

 

  1. Vertex processing
    • 일련의 vertex transformation들을 처리한다.
    • 점들의 움직여진다.
  2. Rasterization (레스터화)
    • 이동된 점들을 이용해서 도형을 그린다.
    • 그려진 도형들을 픽셀(fragment) 단위로 나타낸다.
  3. Fragment processing
    • 각 픽셀들에게 명암과 질감을 부여한다.
  4. Output merging

rendering pipeline

 


Vertex Processing (Transformation Pipeline)

아래의 일련의 과정들은 결국 matrix multiplication을 수행하는 것이다.

 

  1. Modeling transformation : 물체를 공간에 둔다.(world space)
  2. Viewing transformation : 카메라로 표현한다.(camera space)
  3. Projection transformation : 렌즈를 선택한다. (NDC)
  4. Viewport transformation : 화면에 표현한다. (screen space)

 


Modeling Transformation

"물체를 둔다. (local space → world space)"

 

각 object의 local frame들을 global coordinate system에 표현한다.

Linear transformation(translate, scale, rotate)과 affine transformation이 수행된다.

 


Viewing Transformation

"카메라로 표현한다. (world space → camera space)"

 

World space에서 camera space로 표현한다.

Object의 모든 점들을 카메라 관점에서의 점으로 바꾼다.

 

카메라의 위치와 방향을 설정해야 하고, 카메라의 frame을 설정해야 한다.

  1. setting camera's position and orientation
  2. define camera's coordinate(frame)

 

OpenGL에서 카메라는 기본적으로 z의 음수 방향을 바라본다.

 

Eye point, Look-at point, Up vector

  • Eye point : 카메라의 위치
  • Look-at point : 타겟 물체의 위치
  • Up vector : 카메라에 수직인 방향을 나타내는 벡터

eye point, look-at point, up vector

 

Eye point, look-at point, up vector를 이용해서 viewing matrix를 계산할 수 있다.

 

참고 : Define camera's coordinate system

더보기

Eye point, look-at point, up vector을 이용해서 camera coordinate system의 u, v, w 벡터와 origin을 찾아낼 수 있다.

 

1. $v$ 벡터

물체와 카메라를 연장하여 단위벡터를 만든다.

$w \;= \frac{\vec{P_{ref}P_{eye}}}{\| \vec{P_{ref}P_{eye}}\|}\;= \frac{P_{eye}-P_{ref}}{\|P_{eye}-P_{ref}\|}$

 

2. $u$ 벡터

up vector $V_{up}$와 $w$ 벡터를 외적(cross product)한 단위벡터이다.

외적은 교환법칙이 성립되지 않으므로 주의해야 한다.

$u=\frac{V_{up} \times w} {\|V_{up} \times w\|}$

 

3. $w$ 벡터

두 개의 단위벡터인 $w$와 $u$을 외적(cross product)한다.

외적은 교환법칙이 성립되지 않으므로 주의해야 한다.

$v = w \times u$

 

이렇게 만들어진 단위벡터들을 이용하면 camera space → world space로 변환하는 matrix가 계산된다.

따라서 이 matrix을 transpose한 결과로 world spcae → camera space로 변환할 수 있다.

 

gluLookAt()

Viewing matrix($M_v$)을 만들고, crrent transformation matrix에 right-multiply을 수행해서 적용한다.

<pre>gluLookAt(eye_x, eye_y, eye_z, at_x, at_y, at_z, up_x, up_y, up_z)</pre>

 

Modelview Matrix

Modelview Matrix : modeling matrix와 viewing matrix을 합친 것

modelview matrix $M$ = $M_v M_m$

 

카메라를 움직이는 것과 world를 움직이는 것은 같은 행위이기 때문에 가능하다.

Camera space를 움직이는 대신 반대 방향으로 world space을 움직이면 된다.

 

따라서 gluLookAt()은 glRotate*와 glTranslate*로 대체될 수 있다.

예를 들어 카메라를 (1, 0, 2) 만큼 회전하는 것은 world를 (-1, 0, -2)만큼 회전하는 것과 같다.

또한, 카메라를 y축으로 60도 회전하는 것은 world를 y축으로 -60도 회전하는 것과 같다.

 

아래 사진에서의 두 행위는 같은 결과를 나타낸다.

 


Projection Transformation

"렌즈를 선택한다. (camera space → NDC)"

 

Normalized Device Coordinate는 canonical view volume으로 혼용된다.

(정확하게는 다른 것이지만 같은 것을 말할 때가 많다.)

 

Canonical View Volume

[-1, -1, -1] ~ [1, 1, 1] 범위의 3D 정육면체이다.

 

Canonical view volume의 coordinate system이 NDC이다.

NDC의 xy 평면이 실제로 보여질 viewport이다.

 

OpenGL에서 NDC는 left-handed coordinate system이다.

그러나 OpenGL의 projection function이 hand-ness을 바꿔준다.

때문에 view, world, model space는 right-handed을 사용한다.

따라서 함수를 이용해서 사용하면 크게 문제가 되지는 않는다.

 

Projection transformation 결과, 물체가 canonical view volume 안에 들어오게 된다.

그리고 OpenGL은 canonical view volume 안에 있는 object만 그린다.

정육면체 밖에 있는 것은 그리지 않는다.

 

Projection

컴퓨터 그래픽스에서의 projection은 주로 3D coordinate를 2D screen coordinate로 매핑하는 것을 말한다.

그러나 실제로 하는 것은 3D → 3D으로, 임의의 view volume을 canonical view volume으로 매핑하는 것이다.

 

차원이 낮아진다고 해서 물체의 깊이를 표현하는 z 값이 필요없어지는 것은 아니다.

어떤 물체가 앞에있는지를 판단하는 depth test을 위해서 남아있다.

 

자주 사용되는 방법으로는 2가지가 있다.

  • Orthographic projection (Orthogonal projection)
  • Perspective projection

 


Orthogonal Projection

직육면체(cuboid)를 view volume으로 사용한다.

Orthogonal projection은 이 직육면체 view volume을 canonical view volume으로 만든다.

 

원래의 view volume(cuboid)도 near plane과 far plane의 크기가 동일하고,

canonical view volume도 near plane과 far plane의 크기가 동일하기 때문에

orthgonal projection은 원근법을 표현하지 못한다.

 

다만 측정하기 좋기 때문에 CAD, architectural drawing 등에서 자주 사용된다.

 

Canonical view volume은 left-hand 좌표계를 사용하기 때문에 near와 far에서 -부호를 붙여서 생각한다.

Canonical view volume은 카메라가 positive-z 방향을 바라본다.

 

Windowing Transformation

직육면체를 정육면체로 변환하는 것이기 때문에 결국 scaling과 translation의 조합이다.

이렇게 scaling과 translation의 조합으로 한 space을 다른 space로 변환하는 것을 windowing transformation이라 한다.

 

기존의 점(파란색)을 원점으로 translate하고 scaling한 후 다시 translate해서 원하는 위치(빨간색)로 변경한다.

windowing transformation

 

Orthogonal Projection Matrix

Orthogonal projection은 affine transformation이다.

평행한 선분은 평행하게 유지되고 비율도 유지된다.

단, 각도는 유지되지 않는다.

(참고 : affine transformation, rigid transformation의 특징)

더보기
  • Affine transformation
    • preserve lines
    • preserve parallel
    • preserve ratios of distance along a line
  • Rigid transformation
    • preserve distance of all points
    • preserve cross product for all vectors

 

위의 windowing transformation과 동일하게 진행된다.

따라서 아래 matrix을 이용해서 cuboid view volume을 canonical view volume으로 변환한다.

 

 

glOrtho()

<pre>glOrtho(left, right, bottom, top, zNear, zFar)</pre>

orthographic projection matrix을 만들고 current transformation matrix에 right-multiply을 수행한다.

 

함수에서 알아서 left-handed로 변환해준다.

따라서 zNear와 zFar의 부호는 양수이면 카메라 앞쪽(카메라방향)에 물체가 있는 것이고, 음수이면 카메라 뒤쪽방향에 물체가 있는 것이다.

 


Perspective Projection

Perspective

  • Perspective Effects (원근감)
    • 가까운 물체는 크게 보이고, 먼 물체는 작게 보인다.
  • Vanishing point (소실점)
    • 평행한 선들을 쭉 이어서 만나는 점
    • 1개일 수도 있고 여러 개일 수도 있다.
    • 사람의 눈에는 주로 1개

vanishing point

 

Perspective Projection

Frustum(절두체, 사각뿔의 아래부분)을 view volume으로 사용한다.

이 view volume을 viewing frustum이라 한다.

 

Perspective projection은 viewing frustum을 canonical view volume으로 매핑하는 것이다.

 

View volume이 frustum이기 때문에 이를 정육면체(canonical view volume)로 변환하면 먼 부분은 작아지게 된다.

이렇게 함으로써 원근효과가 나타난다.

 

Perspective Projection Matrix

Perspective projection은 affine transformation이 아니다.

Affine transformation이라면 평행한 선분들은 평행하게 유지되어야 하기 때문에 vanishing point가 생길 수 없다.

 

Perspective projection은 homogeneous coordinate을 이용한다.

Homogeneous coordinate에서 $[x \; y \; z] \rightarrow [x \; y \; z \; 1]$로 표현하였다.

관습상 $w = 1$로 항상 표현하였는데, homogeneous에서는 모든 요소에 $w$가 곱해진 것과 의미가 같다.

 

3D → 2D로 projection하는 다음과 같다.

 

그러나 perspective projection에서 실제로 수행하는 것은 3D → 2D가 아니다.

View frustum → canonical view volume으로 하는 3D → 3D이기 때문에 위의 matrix는 달라진다.

결국 다음과 같은 perspective projection matrix가 탄생한다.

 

persepctive projection matrix

 

glFrustum()

<pre>glFrustum(left, right, bottm, top, near, far)</pre>

Perspective projection matirx을 만들고 current transformation matrix에 right-multiply을 수행한다.

 

near와 far의 부호는 반드시 양수가 되어야 한다.

그러나 이 함수는 frustum을 정의하고 어느 정도 perspective한지 조절하는 것에 직관적이지 않다.

 

gluPersepctive()

<pre>gluPerspective(fovy, aspect, zNear, zFar)</pre>

Perspective projection matrix을 만들고 current transformation matrix에 대해 right-muliply을 수행한다.

  • fovy
    • Field Of View Angle in y-direction
    • 단위는 degree이다.
    • y축에 대해서 사각뿔의 각도를 조절한다.
  • aspect
    • $\frac{width}{height}$
    • width와 height의 비율

 


Viewport Transformation

"화면에 표현한다. (NDC → Screen space(Image space))"

 

Viewport는 화면의 사각형 모양의 viewing region이다.

Viewport transformation은 canonical veiw volume을 viewport에 표현한다.

 

 

Viewport Transformation Matrix

Viewport transformation은 scale, translation으로 가능하기 때문에 windowing transformation이다.

따라서 다음과 같은 transformation matrix가 된다.

 

glViewport()

<pre>glViewport(xmin, ymin, width, height)</pre>

  • xmin, ymin, width, height : 픽셀 단위
  • xmin, ymin
    • viewport의 가장 좌측 하단의 위치
    • 화면의 가장 좌측 하단은 0, 0
  • default : (0, 0, window width, window height)

 

OpenGL에서 viewport transformation은 사용자가 하는 것이 아니라 내부적으로 처리된다.

따라서 사실상 canonical view volume 까지만 transformation matrix들을 적용할 수 있다.

 

glViewport 함수는 current matirx에 explicitly하게 viewport matrix을 곱하지 않는다.

 

Object는 viewport에 꽉 채워져서 그려지기 때문에 width와 height의 비율을 1:1로 하지 않으면 object가 찌그러져서 보인다.

 

매번 렌더링할때마다 호출할 필요 없이 main에서 렌더링 전에 한번만 호출하면 된다.

 


참고

본 포스트는 한양대학교 이윤상 교수님의 수업을 정리한 내용입니다.

출처: 한양대학교 이윤상 교수님 컴퓨터그래픽스 강의 강의자료 - https://cgrhyu.github.io/courses/2022-spring-cg.html

 

CGR LAB

Computer Graphics - 2022 Spring Instructor: Yoonsang Lee Teaching Assistant: Chaejun Sohn Undergraduate Mentor: Bokyoung Jang Time / Location: Mon 09:00-11:00 / Online (originally 207 IT.BT Building) - Lab Wed 09:00-11:00 / 508 IT.BT Building - Lecture Cou

cgrhyu.github.io

 

 

 

 

'Computer Science > Computer Graphics' 카테고리의 다른 글

Lighting  (0) 2021.05.31
Mesh, OBJ File  (0) 2021.04.08
Affine Frame  (0) 2021.03.23
[OpenGL] Transformation Matrix  (0) 2021.03.23
Transformation in 3D  (0) 2021.03.16

댓글