ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [14] - Vertex processing - 2
    Graphics 2021. 7. 17. 01:25

    삼차원 Cartesian coordiantes system에서는 Right-handed[RHS] 또는 Left-Handed[LHS]를 사용합니다. RHS에서는 오른손 엄지가 향하는 방향이 z축의 양의 방향이고 남은 손가락이 y축에서 x로 말려서 들어간다고 합니다. 솔직히 강의 시간에 그림을 봐도 직관적으로 와 닿지도 않고 무슨 말인지도 몰랐습니다. 그래서 시험을 볼 때도 사실 마음대로 바꿔서 생각했습니다.

    차라리 RHS를 왼손의 엄지, 검지, 중지를 서로 직각을 이루도록 펼치고 중지-x, 검지-y, 엄지-z라고 두는 편이 직관적이고 좋았습니다. LHS는 이 반대니까 또 그림을 그릴 필요는 없습니다.

    우리가 보통 OpenGL을 사용한다면 RHS를 이용하게 되고 Direct3D를 사용하면 LHS를 사용하게 됩니다. 실질적으로 다음과 같은 차이점을 나타냅니다.

    예를 들어서, 카메라의 위치(EYE)를 (0, 0, 0)이라고 가정하고 At은 (0,0,-1)이라고 해봅시다. 그렇다면 RHS 시스템에서는 다음과 같은 식으로 물체의 상이 잡힐 것입니다.

    각 시스템마다 양의 방향이 다르기 때문에 마지막에 표시되는 화면이 완전히 다를 수 있습니다. 그럼 RHS와 LHS간의 거울을 보는 것 같은 차이를 없애려면 어떻게 하면 좋을까요? z축에 관심을 가지면 됩니다. 즉 RHS에서 LHS로 넘어가려면 어떤 물체의 z축의 좌표의 부호를 반전 하면 됩니다.

    Projection Transform

    개인적으로 그래픽 이론 수업에서 꽃이라고 여겼습니다. EYE, AT, UP등의 요소들은 Camera의 External Parameters라고 합니다. 그럼 Internal Parameters도 존재할 겁니다. 카메라 렌즈, 줌의 정도, 굴절 등등이 Internal Parameters입니다. 이 Projection Transform은 Internal parameters에 의해 결정이 됩니다. 

    View Frusum

    직관적으로도 카메라가 어떤 공간의 모든 물체들을 잡을 수는 없습니다. 이렇듯 카메라의 위치나 각도에 따라서 논리적으로 보일 수 있는 물체들만 모아 놓은 어떤 공간을 View Frustum 또는 View Volume이라고 합니다.

    그림이 너저분하지만 필요한 건 다 있습니다. 점선인 그림은 각도 때문에 카메라에 잡히지 않는 물체입니다. 좌표가 있는 곳 원점이 카메라의 EYE이며 Truncated Pyramid로 확산하는 방향이 AT입니다. 

    상이 맺히기 시작하는 공간에서 카메라까지 가장 가까운 지점을 n[near]이라고 합니다. 또 멀리 떨어진 지점을 f[Far]이라고 합니다. 아래의 그림에서 -f와 -n이로 표현된 지점이 각각 far와 near입니다. far는 게임의 경우 얼마나 멀리 렌더링 할 것인지 결정하는 요소가 됩니다. f의 값에 따라 100m까지 또는 1000m까지 보일 수 있게 됩니다. 아마, 옵션에서 Far라는 옵션이 있는 게임이 있을 수도 있습니다.

    Aspect의 경우엔 View frustum의 비율을 결정하게 됩니다. 일반적인 모니터에 드러나는 화면의 화면을 일컫는 말입니다.

    View Frustum Culling

    카메라 내에 없는 물체를 구태여 계산할 필요가 없습니다. 그래서 이 Culling을 통해서 렌더링이 필요 없다는 판단을 내리면 GPU Graphics Pipeline에 싣지 않습니다. 그런데 Clipping이랑은 조금 다른 개념입니다. Culling은 카메라에 아예 등장하지 않는 mesh에 대한 적용이지만 Clipping은 View Frustum 내에 '일부'가 들어왔을 때 실시합니다. 

    위에서 본 Truncated Pyramid는 Clipping엔 사용되지 않습니다. 대신에 (0, 0, 0)을 중점으로 하는 2x2x2 정육면체 공간에 이 View Frustum을 변환하고 해당 공간에서 Clipping을 합니다. 그래서 Clip이 일어나는 공간이라는 뜻에서 Clip Space라는 이름을 갖고 있습니다. 또한 이 변환을 Projection Transform이라고 합니다.

    View Frustum을 측면에서 보면 다음과 같은 꼴이 나올 것입니다. 수평으로 그인 선들을 Projection line이라고 합니다. 

    또, View Frustum 상의 물체들의 각 Vertex에서 EYE를 향해 빛을 쏜다면 반드시 그 빛은 Projection Plane이라고 적힌 평면에 부딪히고 상이 맺히게 됩니다.

    이를 2x2x2 공간으로 잡아 늘린다고 상상을 하면 near에 가까운 물체들은 늘어나고 far에 가까운 물체들은 줄어드는 현상을 목격할 수 있을 것입니다. 

    일상 속 경험에서 남산 타워를 배경으로 사진을 찍는다고 했을 때, 멀리 보이는 남산 타워는 작고 그 앞에 서있는 어떤 인물 x는 크게 보이는 것과 같은 효과를 노리는 겁니다.

    이제 본격적으로 Projection Transform을 구해보겠습니다.

    한 가지 더 추가하자면 OpenGL ES는 RHS에서 시작하여 Clip space에 이르면 LHS상태가 됩니다. 왜냐하면 Projection Matrix를 구하는 과정 속에서 -z를 곱하는 과정이 포함되어 있었습니다. 바로 이 과정에서 LHS로 바뀐 것이며 이후 발생하는 Hardwire Processing은 LHS로 처리함을 유의해야 합니다.

    'Graphics' 카테고리의 다른 글

    [16] - Swap Chain  (0) 2021.07.19
    [15] - COM object  (0) 2021.07.19
    [13] - Vertex processing - 1  (0) 2021.07.15
    [12] - Space and transforms - 2  (0) 2021.07.14
    [11] - Space and transforms - 1  (0) 2021.07.13
Designed by Tistory.