컴퓨터 그래픽스

    1. 쿼터니언

    오일러 각으로는 짐벌락 현상이 일어나므로 4가지 변수(x, y, z, w)를 사용하여 회전의 벡터로 이용한다. 이 4가지 변수 좌표를 쿼터니언(Quaternion)이라고 한다.

     

     1-1) 짐벌락

    오일러 각(yaw, pitch, roll)을 사용할 때 오브젝트의 두 회전 축이 겹쳐 원하는 방향으로 회전할 수 없는 일이 생기는데, 이를 짐벌락이라 한다.

     

    이는 컴퓨터가 회전 축이 겹쳤을 때 어떤 회전 축을 기준으로 해야하는지를 몰라서 발생한다. 즉, 한번에 회전이 연산되는 것이 아니라 회전에 순서가 존재하기 때문이다. 좀 더 풀어서 설명하자면, y축 기준으로 x축을 90도 회전하면 z축과 평행해지는데, 이 상황에서 x축으로 45도를 돌리면 z축도 45도 돌아간 것과 같아진다. 즉 축이 겹치는 것이다(위 영상처럼 하나를 돌렸는데 두개가 다 돌아감). 이를 해결하기 위해 하나의 값을 더 넣은 쿼터니언으로 보완한다.

     

    2.

     

    3. 파이프라인

     3-1) 렌더링

    렌더링이란 컴퓨터로 영상을 만들어내는 모든 과정을 말한다. 즉, 모니터에 어떻게 표현할 것인가의 의미이다. 파이프라인이란 어떤 입력 값의 출력이 다음 입력으로 들어갈 때를 말하는데, 렌더링 파이프라인은 렌더링 과정 시의 그러한 프로세스를 의미한다.

     

    사용 목적은 3차원의 모델을 2차원 래스터 이미지로 변환하기 위해서다. 디스플레이의 경우에는 래스터 디스플레이와 벡터 디스플레이가 있다.

    TO-DO: * 래스터 디스플레이

    TO-DO: * 벡터 디스플레이

     

    렌더링 파이프라인(= 그래픽스 파이프라인)의 과정은 DirectX 버전에 따라 약간씩 다른데, 큰 틀은 다음과 같다.

    https://docs.microsoft.com/ko-kr/windows/win32/direct3d12/pipelines-and-shaders-with-directx-12

     

    (1) Input Assembly

    정점 버퍼(위치, 노말, 색상, UV : 배열 형태) 자료구조를 이용해 정점 데이터를 CPU -> GPU로 운반한다.

    GPU는 Vertex 명세를 통해서 구조체로 만들고, 삼각형과 같은 기본 도형(Primitive)로 조립한다.

     

    http://what-when-how.com/computer-graphics-and-geometric-modeling/transformations-and-the-graphics-pipelinebasic-computer-graphics-part-1/

    (2) 정점 쉐이더(Vertex Shader), Geometry pipeline

    Modeling Transform (Model = Local -> World) 

    Input Assembly에서 조립한 Primitive가 입력으로 들어온다.

    Modeling Transform에서는 이를 로컬 좌표계 -> 월드 좌표계로 변환한다.

     

    * 로컬 좌표계(또는 오브젝트 공간, Model Space, 위 이미지의 Shape coord)는 자신을 원점으로 하는 좌표이다. 

    각 오브젝트를 기준으로 하는 좌표계가 필요할 수 있으므로 존재하며, Model Transform에서는 월드 공간을 기준으로 통합하는 과정이다. 즉, 편하게 하나의 좌표계에서 모든 물체의 좌표를 표현하기 위한 목적으로 사용된다.

     

    Translate, Rotate, Scale 세 가지 변환이 일어나는 부분이다.

     

    TO-DO: Translate, Rotate, Scale 순서 주의 사항

     

    ③ View Transform (World -> Camera)

    월드 좌표계로 옮긴 오브젝트를 카메라 좌표계(Camera, View)으로 옮기는 과정이다. 화면에 띄우기 용이해지도록 카메라를 기준으로 변환하는 작업이다. up-vector가 y축이며 바라보는 방향이 -z축이다.

     

    * View Plane: 카메라 좌표계의 xy평면과 평행하다.

     

    ④ Projection (Camera -> 

    앞선 카메라 좌표계(Camera)에서 클립 좌표계(Clip)으로 옮긴다. 이 때 절두체를 정의하여 화면에 보여야할 부분과 아닐 부분을 구별하여 지울 부분은 지운다. 클립 공간에서의 좌표는 동차 좌표계(Homogeneous Coord)이다. NDC -> viewport로 옮기는 작업을 수행한다([-1, -1, -1] ~ [1, 1, 1] 정육면체로 변환). 

     

     

    * 동차 좌표계(Homogeneous Coordinates): (x/h, y/h, 1)로 표현되며, 그래픽 연산에서 translate, rotate, scale을 공통의 행렬연산으로 표현할 수 있으며 반복적인 그래픽 연산에서 효율적이다. h=0일 경우 무한 지점의 좌표를 표현할 수 있다.

     

    * 절두체(Frustum): 화면에 렌더링 될 수 있는 영역

    https://docs.unity3d.com/kr/2021.3/Manual/UnderstandingFrustum.html

    위의 이미지 처럼 평면 카메라에 표현될 때, 같은 직선이어도 위치와 각도 등에 따라 보이는 부분과 아닌 부분이 나뉜다.

    절두체를 정의하는 방식은 기본적으로 Plane을 이용한 방식이 있다. 이는 카메라에 가장 가까운 면(Near), 가장 먼 면(Far) 등이 대표적이다. 이 때 컬링의 개념이 등장한다.

     

    * 컬링(Culling): 필요없는 Vertex는 제거하여 부하를 줄이는 방법이다.

     

    - 후면 컬링 (Back-Face Culling)

    카메라 기준 뒷 부분을 그리지 않고 넘어가는 것이다. 방향 벡터를 이용하여 기준 벡터와 반대면 후면이라고 판단한다.

     

    - 시각 절두체 컬링 (View Frustum Culling)

    카메라로 보이는 영역 밖은 그리지 않는 것이다. 각 평면을 무한히 뻗어나가게 하고, 그 안에 폴리곤이 존재한다면 표현하는 방식이다. 

     

    - 폐색 제거 (Occlusion Culling)

    한 오브젝트가 다른 오브젝트에 가려져 보이지 않을 때 그리지 않는 것이다.

    Projection은 원근감이 없는 직교 투영(Orthographic)과 반대의 원근 투영(Perspective)이 있다.

    직교 투영은 수직에서 바라보는 것으로, 3D, 4D가 2D로 전환된다. 미니맵 등이 그 예시이다.

    원근 투영은 원근감을 유지하는 것으로, 가까운 물체는 크고 먼 물체는 작게 보인다.

     

    ⑤ 래스터 라이저(Rasterizer)

    래스터라이저란 무엇일까? 래스터(Raster)란 쉽게 픽셀을 떠올리면 된다. 즉 래스터라이저는 클립 공간으로 넘어온 데이터들을 화면에 평면적인 픽셀로 띄우는 것이다. 프래그먼트(Fragment)라는 것을 구성한다. 프래그먼트란 조각이라는 뜻으로, 픽셀을 띄울 데이터들이라 볼 수 있겠다. 보통 이 단계에서는 각 정점들을 앞서 배운 Primitive라는 기본 도형들로 처리한다. 

     

    래스터 라이저에서는 5가지 과정을 거친다.

     

    - 클리핑(Clipping)

    컬링과 비슷하지만 헷갈리는 부분이다. 컬링은 절두체를 벗어나는 부분을 지워 연산하지 않는 것인데, 클리핑은 연산은 한다고 한다. 

    클리핑, https://www.allbca.com/2020/04/clipping-types-in-computer-graphics.html

     

     

     

    4. OpenGL

    OpenGL은 Graphic Library로, Windows와 OpenGL을 연결시키기 위해 Glut을 사용한다.

    * Glut : 프로그램 작성 용이, 기능 부족

     

    5. Aliasing

    https://cutemoomin.tistory.com/entry/%EC%95%88%ED%8B%B0%EC%97%98%EB%A6%AC%EC%96%B4%EC%8B%B1-SSAA-MSAA-FXAA-SMAA
    http://mielliott.github.io/Presentation/script.html

    어떤 오브젝트의 Boundary에서 계단 모양의 jagged artifact가 발생한다. 주요 이유는 부족한 해상도에 의한 low-frequency sampling이 존재한다. 대각선의 선을 표현하는데, 현재의 해상도만으로는 위의 aliased처럼 일정치 못한 간격으로 대각선을 표현해야하기 때문에 발생한다.

     

    https://docs.unity3d.com/kr/530/Manual/script-Antialiasing.html

     

     5-1) Nyquist Sampling Theorem

    원 신호의 주파수 2배 이상 Sampling해야 원래 신호 복원이 가능하다는 이론으로, Aliasing의 이론적 근거가 된다.

    http://mielliott.github.io/Presentation/script.html

     5-2) 안티앨리어싱(Anti-aliasing)

    안티앨리어싱은 Super Sampling(SSAA), Multi Sampling(MSAA), Fast Approximate(FXAA) 등의 기법이 있다.

     

    - Super Sampling(SSAA)

    한 픽셀(부모 픽셀)을 더 잘게 subpixel로 분할한다. 이 때 이미지가 차지하는 subpixel의 수에 따라 부모 픽셀의 색깔을 결정한다(옅게 또는 짙게). 추가적으로 이미지의 Line Width를 고려하거나 중심 등 위치에 따라 가중치를 두는 방법을 사용하기도 한다. 샘플링과 쉐이딩 모두 여러번 이뤄지므로 고성능을 요구한다.

     

    - Multi Sampling(MSAA)

    Super Sampling이 subpixel로 나누며 사실상 고해상도로 렌더링 하는 과정이므로, 부하가 걸리는 문제점이 존재한다. 따라서 MSAA가 만들어졌다. MSAA는 주변의 중간색으로 해당 픽셀의 색을 결정하는 방식인데, 아래의 MSAA 뒤의 숫자 2, 4, 8은 어느 정도의 영역으로 주변색을 파악할 것인지 정하는 것이다. 

    https://post.naver.com/viewer/postView.nhn?volumeNo=31787951&memberNo=48100560

     

    - Fast Approximate(FXAA)

    https://cutemoomin.tistory.com/entry/%EC%95%88%ED%8B%B0%EC%97%98%EB%A6%AC%EC%96%B4%EC%8B%B1-SSAA-MSAA-FXAA-SMAA

    직역하면 빠른 근사인데, 화면의 색깔 변화를 통해 Boundary를 찾고, 블러 처리를 통해 표면의 계단 현상을 줄이는 방식이다. low-end PC에 최적이다. 다만 성능 최적화에 신경 쓴 만큼 각도에 따라 자글거리는 현상이 일어나기도 한다.

     

    - Subpixel Morphological(SMAA)

    여러 필터나 알고리즘들을 미리 생성해놓고, 각 상황에 맞게 덮는 방식이다.

     

    - Temporal(TAA)

    이전의 프레임괴 비교하고 현재의 프레임과 블렌딩하여 중간 이미지를 만들어 표현하는 방식이다.

     

     5-3) 안티앨리어싱 단점

    이론 상 배울때는 말만 들었는데, 공부 후에 게임에서 실제 적용해보니 그 단점이 드러났다. 아래의 예시는 실제로 게임을 하면서 겪은 문제인데,

    새로 키우는 샤이 (TAA 적용)

    아무래도 가장자리 부분이 뿌옇게 흐려지는 문제가 발생한다. 네이버 포스트에 더 정확한 예시가 있다

    https://post.naver.com/viewer/postView.nhn?volumeNo=31787951&memberNo=48100560

     

    6) 

    'CS지식' 카테고리의 다른 글

    운영체제(OS, Operating System)  (0) 2022.08.08
    컴퓨터 네트워크  (0) 2022.08.05
    C, C++, C#  (0) 2022.08.03
    자료구조와 STL  (0) 2022.06.23
    [인공지능] Basic  (0) 2022.03.11

    댓글