본문 바로가기

ComputerGraphics [고려대학교_한정현]

5강(1) - 랜더링 과정 중에서 View Transform ( World Space -> Camera Space 변환)

GPU 에 의해서 Rendering 이 어떻게 수행되는지 자세하게 Detail 들을 배워나갈 것이다.

PolygonMesh 가 GPU 에 의해서 렌더링 되는 과정

주전가와 같은 polygon mesh 가 drawcall 에 의해서

GPU 내부로 들어간다.

Polygon Mesh 의 정점들은 vertex array 에 저장이 되어있을 것이다.

 

[ Vertex shader ] Shader라는 프로그램을 짜줘야지만 GPU 에서 실행된다. 

  Vertex array 에 저장된 정점들을 한번에 하나씩 불러들이면서 여러가지 연산을 수행한다.

 

[  Resterizer ] 하드웨어에 셋팅된 정해진 기능만 수행한다.

   Index array 의 정보들을 이용해서 삼각형들을 다시 일단 조립을 한다.

   이 삼각형은 픽셀들의 조합으로 되어있을텐데,

    이 픽셀들의 정보를 ( 색상 ) Resterizer 가 모아서 각 픽셀 위치마다 저장을 해놓는다. 

    그 저장해 놓은것을 Fragment 라고 한다. ( 예비 픽셀, 후보픽셀 정도라고 이해해라.)

    (래스터화된 이미지는 컴퓨터 디스플레이, 비디오 디스플레이 또는 프린터에 표시되거나 비트맵 파일 형식으로 저장될 수 있다.)

 

[ Fragmenet shader ] Shader라는 프로그램을 짜줘야지만 GPU 에서 실행된다. 

   Fragment 의 실제 컬러를 결정을 한다.

 

[ Output merger ] 하드웨어에 셋팅된 정해진 기능만 수행한다.

최종적으로 최종으로 결정된 색상을 보여줄지 말지 결정한다. 보여줘도 어떻게 보여줄지 결정을 한다.

 


[Shader] 

 쉐이더는 말그대로 프로그램이다. Vertex 에 적용해야 하는 연산을 우리가 원하는대로  작성할 수있다.

 Object space에서 정의된 정점을 최종적으로 Clip space로 옮겨주는 것은 반드시 해야한다.

 아래의 그림은 그 과정이다.

shader 는 object space 의 정점을 clip space로 옮겨주어야 한다. 그 과정을 나타낸 것이다.

(tip) 4장에서 Vector 를 World Transform  ( Vector들을 Object space -> World space로 옮기는 과정 )하는 방법을 배웠음.

       이제       Vector normals를  World transform 하는 것을 배워야한다.


[ Vector normals World Trasform - 법선벡터의 월드 변환 ] 

 4장에서 Vertex의 position의 World Transform 은 Affine Transform(S,R,T)  을 통해 만들어 냈었다.

 Vertex의 position 의  World Transform 은  즉,  [L|T]로 표현할 수 있다.

 

 ★그렇다면 Vertex 의 normals(법선벡터)의 World Transform 은 ? 

  결과적으로,  L의 inverse, transpose ( 역행렬의 전치행렬) 에  n(법선벡터) 곱해주면 된다.  그리고 normalized 해주면 끝.

 ☆ 아래는 그것을 증명해 보이도록 할것이다.

   Vertex Normals 에 월드변환을 적용해보자. 

           ㄴ vn = [L|T]n  이렇게 된다. 

   [L|T]n = Ln + T  ( ∵ 벡터는 움직여봐야 동일하다. 그래서 T는 생각하지 않아도 된다.  )

   ∴ Ln을 통해 법선벡터의 world Transform 을 만들어 낼 수 있다.

 

 [ Non uniform 한  scaling 의 경우]

 ex_1 ) 여기서 Linear tranform 이 non uniform 한 scaling 이라면 ????  ( non uniform scaling 예시 (1/2, 1/2, 2) )

           qna) non uniform 한 scaling그대로 Ln에 적용하면 되는가?

           ans) 안된다. non uniform 한 scaling 이라면 , 법선벡터가 이상해진다. 

   

( 틀린방식 ) non uniform scaling 이후에 법선벡터가 이상해진것을 볼 수 있다.

ex_2)  non uniform 한  sacling 일때 올바른 Ln 구하는 방법

           L 의 Inverse(역행렬)에 Transpose( 전치행렬)를 해주어야 한다.

          그리고 나서 Ln 에 적용해서   world transform 된 법선벡터를 구해야한다.

( 올바른 방식 ) ( L의 Inverse에 Trasnpose 핸다. )

   ex_3 )  uniform scaling 한 법선벡터의 worldtransform 도 ex_2처럼 하면 안되나? 

       된다.  그러니까 그냥 L^(-1T) 로 통일하자.

 

 



[Shader]

 쉐이더는 말그대로 프로그램이다. vertex 에 적용해야 하는 연산을 우리가 원하는대로  작성할 수있다.

 object space에서 정의된 정점을 최종적으로 clip space로 옮겨주는 것은 반드시 해야한다.

shader 는 object space 의 정점을 clip space로 옮겨주어야 한다. 그 과정을 나타낸 것이다.

 우리는 World transform 까지 할 줄 알게 되었다. 이제, View transform 을 배우러 가보자.

  tip ) 모든 vertex 는 World space 의 좌표를 가진다. 하지만, 이를 렌더링(그리는데) 사용하려면 어렵다.  Camera Space 는 비교적 랜더링 알고리즘을 개발하는데 쉽다. 그래서 Camera Space 로 옮겨서 Camera Space 의 좌효표를 얻는  view transform 이 필요하다. 

 

[View Transform] 

   World space가 있을때, 그 월드공간을 어디서 어떻게 볼것인지 결정한 Camera Space 에서 바라보도록 하는 Transform ( 변환 ) 이다.

 

[ EYE ]

  Camera 가 어디서 볼것인가

[Look AT] 

  내가 기준으로 삼는 점의 3차원 좌표가 필요하다.

[UP]

  카메라가 얼마나 기울어지는지 체크하기 위한 up 벡터가 제공된다.

 

 

 

[Camera Space] 

  ( u, v, n )은 orthonormal 한 축이고, Eye라는 원점까지 있다면 ,그야말로 space의 필요충분조건을 다갖추지 않았는가! 그것을 camera space라고 한다. 

[Camera Space의 (u,n,v) 구하기]

  카메라 스페이스를 다음과 같이 표현했을때 ( u, n, v , Eye(origin) )

  우리는 Camera Space 의 u,n,v 벡터를 주어진  Eye, At, Up 세개의 벡터로 구해낼 수 있다.

  Cross product를 이용해서 구하는 것이다.  (오른손의 법칙)

n,u,v 를 Eye, At, Up 벡터로 구하는 공식

 

[ At 을 Camera Space 로 표현해보자]

 EYE를 기준으로 At의 벡터 방향은 ( 0, 0 , -n ) 이 된다.

 EYE를  기준으로 At까지의 길이가 10이라고 하면 

 AT 은 ( 0, 0 , -10 ) 이 될것이다. 

 이것을 world space 에 있는 At vertex 를 camera space 좌표계로 표현한 방법이다.

 

 

[View Transform (Camera Space 좌표를 얻는) 과정]

 1.  Camera Space을 World space에 포개지도록 한다.

   - 원점이 다르므로 translation 을 한다.  ( EYE 좌표를 원점좌표로 이동 )

   - EYE좌표가 옮겨감 = Camera Space가 옮겨감 & 물체 또한 옮겨간다. 

EYE 좌표를 원점으로 옮기는 Translation 행렬

 2 . (u, v, n) 을 (e1, e2, e3) 와 겹쳐지게 만든다.

    - 이것은 Rotation 으로 하는것 ( 빨간색 박스는 , 밑밑 사진의 (b) 를 통해 이해하면 된다. ) 

회전을 통해서 basis 가 맞춰졌고, 물체도 roatate 되었다.

    - Rotation 은 어떻게 해야하는데? 

      이것은 4장 맨마지막에서 배웠었다. ( 아래 참고사진에서  (b) 과정  ) 

      u,v,n 과 다른 방향을 가지는 축을 u,v,n 과 동일하게 맞추려면 전치행렬을 곱해주면 되었다.

object space 에서의 rotation 을 통한 축변환 -> 현재는 이것을 응용해서 camera space에 적용할

 

 [ View Transform  을 4x4 행렬 곱으로 나타내면? ]

 world space 의 좌표에 아래의 것을 곱하면 

 camera space 의 좌표를 얻을 수 있다!!

 


[오른손 좌표계 -> 왼손 좌표계]

 z축만 변경해주면 된다.