ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [13] - Vertex processing - 1
    Graphics 2021. 7. 15. 17:43

    world transform 등 vertex에 대해 여러 계산을 하여 처리를 했습니다. 이러한 Vertex Processing이 GPU 내부에서 어떤 방식으로 동작하는지 Rendering pipeline과 함께 알아보기로 합니다. GPU내부에서는 Rendering이 파이프라인 구조를 통해서 완성됩니다. 각 단계[stage]의 출력[output]은 다음 단계의 입력[input]으로 사용됩니다. 

    GPU Rendering Pipeline은 다음과 같은 과정을 포함합니다. 그래픽 카드의 종류, 소프트웨어의 종류에 따라서 다음 단계는 때때로 생략이 되기도 하지만 보편적으로 혹은 비교적 최신의 그래픽 파이프 라인은 다음과 같은 절차를 밟습니다.

    Vertex Specification > Vertex Shader >

    { Hull-Shader(Tessellation Control Shader) > Tessellation > Domain-Shader(Tessellation Evaluation Shader) } >

    Geometry Shader > Vertex Post-Processing > Primitive Assembly > Rasterization > Fragment Shader >

    Per-Sample Operation > Final Output ! 

    아마, DirectX 12나 D3D의 문서를 읽으며 확인할 수 있는 내용일 것입니다. Shader라는 Suffix가 붙은 단계는 일종의 프로그램으로써 사용자가 직접 제어를 할 수 있는 반면에 shader가 아닌 단계는 고정된 단계로 정해진 대로 동작합니다. 그런데 '정해진 대로만 동작'엔 어떤 의미가 있을까요? 반복되는 작업이나 알고리즘에 대해서 최적화가 되어 있다는 뜻입니다. 자주 처리해야 할 절차가 최적화가 되어 있다면 그대로 쓰는 편이 훨씬 좋을 것입니다. 

    Vertex Shader

    Vertex specification은 단순히 삼차원 물체를 Input으로 CPU에서 GPU로 넘겨주는 과정을 지칭합니다. 이 Vertex Shader는 한 vertex에 한정되어 동작하는 것이 아니라 모든 vertex에 대해 동작합니다. 즉. 100개의 vertice가 존재한다면 100번 작동합니다. 이 Vertex Shader는 Vertex를 Final Position을 결정합니다. 

    Object Space

    -> (World Transform) ->

    World Space

    -> (View Transform) ->

    Camera Space

    -> (Projection Transform) ->

    Clip Space

    각 Space에는 의미가 있습니다. Object Space는 어떤 Mesh가 스스로를 중심으로 위치한 위상 공간을 말합니다. 여기에 World Transform으로 각 Vertex들을 옮겨 필요한 Object들을 한 공간에 모아 놓은 공간을 World Space라고 합니다.

    이제 이 상태에서 사용자 또는 카메라가 이 World Space를 바라보는 '시점'이 필요합니다. 그것을 계산해주는 것이 View Transform이며 물체들이 어떤 카메라를 통해 보이는 것처럼 속이는 공간이 Camera Space입니다. 기본적으로 그래픽에서는 '카메라'라는 것이 존재하지 않고 고정된 공간 속의 물체들을 왜곡하여 마치 한 시점에서 보이는 것처럼 속이는 것입니다. 마지막으로 Projection Transform까지 진행하면 원근법을 비롯한 가상 플레이어의 시야로 물체들을 잘라낼 수 있습니다. 차차 정리할 내용이니 자세히 적지는 않았습니다.

    World Transform

    World Transform은 자세히 했으니 간단히 정리만 합니다. 두 개의 Object Space를 하나의 World Space로 옮길 땐 각 Object마다 World Transform이 존재할 수 있습니다. 그런데 Vertex Normal이라면 이야기가 조금 다릅니다. 일반적인 vertex들은 [ L | t ]꼴의 Transform을 통해 값을 변환할 수 있었습니다. 하지만 vertex normal은 Linear transform에만 영향을 받고 translation에는 영향을 받지 않습니다. 특히, Non-Uniform scaling은 surface normal에 일반적으로 적용이 되지 않습니다. 

     

    Translation을 수행해도 vector인 normal은 크기와 방향만 같으면 같은 vector입니다

    Non-Uniform Scaling을 실시하면 위의 Figure처럼 Norm Vector가 달라져버린 모습을 확인할 수 있습니다. 따라서 Vertex에 적용하는 Transform을 Norm vector에는 사용해서는 안 됩니다. 결론부터 말하면 선형변환행렬 L의 Inverse Transpose행렬을 사용해야 합니다.

    변환행렬 [ L | t ]에서 L이 Non scaling을 포함하지 않는다면 norm vector도 그냥 변환이 되지만 포함이 되면 문제가 생깁니다. 따라서 그냥 inverse transpose를 사용하는 편이 좋으며 반드시 변환 이후에 Normalise하여 크기가 1인 벡터로 만들어주는 것도 잊지 않습니다. 이번엔 왜 Transform matrix의 Inverse Transpose꼴을 사용해서 Normal vector를 변환해야 하는지 확인해보겠습니다.

    View Transform

    이제 World transform에 대한 개략적인 내용은 이해했습니다. 이번엔 View Transform으로 넘어갑니다. 먼저 World Space를 하나 상상해봅시다. 실내 수영장을 예를 들어보면 수영장 입구에 들어서면서 시야에 보이는 물체들이 우리의 몸(눈알)의 위치에 따라 달라진다는 것을 확인할 수 있습니다. 즉, 눈(카메라)을 통해 보게 되는 공간을 정의한 것이 Camera Space입니다. World Space에서 Camera Space로 넘어가기 위한 계산이 View Transform입니다. 이때, 총 세 가지의 vector가 아주 중요하게 다루어 집니다.

    Eye = 카메라의 위치

    At = 카메라가 보고 있는(향한) 곳

    Up = 카메라의 위쪽을 정의한 곳

    Normal vector의 등장부터 짐작했으나 선형대수에 대한 기초적인 지식이 없으면 이해하기 난해할 수 있습니다. 이제, Camera Space는 이 벡터들로 정의할 수 있습니다.

     

    'Graphics' 카테고리의 다른 글

    [15] - COM object  (0) 2021.07.19
    [14] - Vertex processing - 2  (0) 2021.07.17
    [12] - Space and transforms - 2  (0) 2021.07.14
    [11] - Space and transforms - 1  (0) 2021.07.13
    [10] - App class  (0) 2021.07.13
Designed by Tistory.