Unity/유니티그래픽스최적화

PART2.렌더링 파이프라인

잡템 2021. 12. 28. 06:03
도서 "유니티 그래픽스 최적화 스타트업"을 읽고 개인공부용으로 간단하게 정리한자료입니다.

렌더링 파이프라인(Rendering Pipeline) 이란?

간략하게 '3D 이미지를 2D 래스터 이미지로 표현하기위환 단계적 방법을 의미'

그래픽스 렌더링 파이프라인이나 그래픽스 파이프라인이라 부르기도 함

 

  • 게임루프

Initialization(초기화) -> Update - > Render -> Decomminssioning(해제) 순으로 진행되며

Upade와 Render과정이 루프가 일어난다

 

  • 유니티 게임오브젝트 스크립트 라이프 사이클

https://docs.unity3d.com/Manual/ExecutionOrder.html

 

Unity - Manual: Order of execution for event functions

Instantiating Prefabs at run time Order of execution for event functions Running a Unity script executes a number of event functions in a predetermined order. This page describes those event functions and explains how they fit into the execution sequence.

docs.unity3d.com

이또한 게임루프와 크게 다르지않음을 확인할 수 있다.

 

  • 렌더링 파이프라인

렌더링 파이프라인을 이 도서에서는 크게 구분하여 

 

Application -> Geometry -> Resterizer 이렇게 세가지로 나눠서 표현하며 세파트로 나눈 이유는 컨셉상의 목적이고

실제로 렌더 파이프라인 과정이 세가지로 분할되진 않는다.

 

  • 애플리케이션 스테이지(Application Stage)

 애플리 케이션 상에서 처리되는 단계를 의미, 렌더링 파이프라인은 보통 GPU파이프라인을 의미하므로 CPU에서 연산하는 단계인 애플리케이션 스테이지는 보통 렌더링 파이프라인에서 제외하지만 본격적인 렌더링 파이프라인 진입전 CPU에서 미리 필요한 연산을 처리 해줘야 하기때문에 큰 의미로 렌더링 파이프라인의 일부라 할 수 있다.

 

 예를들어 캐릭터 이동의 경우 매 프레임마다 위치정보와 애니메이션 정보, 뼈대 위치를 계산하여 메쉬의 버텍스에 반영해 주어야 하는데 이는 정확한 렌더링을위해 반드시 필요하며 이 과정에서 수행되는 연산은 최종적으로 렌더링 파이프라인의 성능에 영향을 미친다.

 

애플리케이션 스테이지에서는 현재 프레임에서 렌더링 가능한 오브젝트를 컬링 연산을이용해 선별하며 컬링 단계에서 효율적으로 오브젝트를 선별하여 렌더링이 필요한 오브젝트가 줄어들면 그만큼 GPU 파이프라인의 부담을 줄여 줄 수있다. 또한 배칭 처리의 연산도 GPU 파이프라인 진입 전에 이루어진다.

(컬링과 배칭은 도서 [Part4]에서 다루므로 나중에 정리)

 

  • 지오메트리 스테이지

지오메트리를 구성하는 요소인 버텍스와 폴리곤 처리를 담당하는 스테이지로 전반적으로 오브젝트의 각 버텍스를 화면상 적절한 위치에 배치시키는 과정을 의미한다.

 

-메시(Mesh)

컴퓨터 그래픽스에서는 삼각형을 만들기위한 점을 버텍스(vertex), 삼각형은 폴리곤(polygon) 폴리곤이 모여 오브젝트의 형태를 보여주는 메시(Mesh)가 된다.

사실 폴리곤이란단어의 의미는 다각형 모두를 포함하지만 사각형은 삼각형 2개, 오각형은 삼각형 3개로 만들어진다.

이와같이 다각형의 최소단위가 삼각형이기에 렌더링 파이프라인에서 말하는 폴리곤은 삼각형을 의미한다.

 

-버텍스 트랜스폼(Vertext Transform)

버텍스 데이터는 GPU메모리에 저장되며 렌더링 수행시 GPU는 메모리로부터 버텍스 데이터를 가져와 적절한 위치에 그려주기위해 위치 변환 트랜스폼(transform)을 수행한다.

 

저장된 데이터는 특정 위치가 반영된 데이터가 아닌 메시의 형태만 반영되어잇는 데이터로 한개의 메시가 여러 인스턴스에서 사용되고 위치가 매번 달라지기때문에 원본 메시에 위치정보를 반영 할수 없어 원점 기준의 메시 모델에 대한 위치 데이터만 가지고 있으며 이를 로컬 스페이스에 존재한다고 표현한다.

 

-월드 트랜스폼(World Transfrom)

위와같은 로컬스페이스 데이터를 3D공간상 특정 위치에 배치해야 하는데 예를들어 오브젝트의 트랜스폼 컴포넌트의 Position이 (-4, 0, 1) 이고 Rotation이(0, 30, 0)이라면 메시데이터를 x=-4, y=0, z= 1로 배치하고 y축으로 30도 회전시켜주어야 한다.

 

이런식으로 월드 스페이스 혹은 월드 좌표계로 전환하는것을 월드 트랜스폼이라고 한다.

 

-뷰 트랜스폼(View Transform)

월드 스페이스로 변환된 뒤에는 카메라 스페이스로 변환이 필요한데 그이유는 월드 트랜스폼을 거쳐 모든 오브젝트가 올바른 위치에 배치되었지만 이오브젝트는 카메라를 통해 디스플레이가 되므로 카메라는 항상 원점(0,0,0)에 존재하는것이 아닌 카메라 역시 고유의 위치와 방향을 가지고 있어 오브젝트의 버텍스를 카메라와 상대적인 위치로 변환해 주어야 한다.

 

이런공간을 카메라 스페이스 또는 뷰 스페이스라고 부르며, 뷰 스페이스로 변환하는 과정을 뷰 트랜스폼이라고 한다.

 

-프로젝션(Projection)

오브젝트는 3차원공간에 위치하지만 실제로 오브젝트가 렌더링되어 디스플레이되는 공간은 모니터이므로 2차원이다.

따라서 3차원 공간을 2차원 상의 위치로 매칭 시켜주는 과정을 프로젝션이라고 한다.

 

 프로젝션 트랜스폼에는 원근법이 적용되는 퍼스펙티브 프로젝션(원근투영, Perspective Projection) 과 

원근법이 제거된 오쏘그래픽 프로젝선(직교 투영, orhographic projection)이 있다.

 

-버텍스 쉐이더(Vertex Shader)

 트랜스폼 변환은 버텍스 쉐이더에서 이루어진다, 버텍스 쉐이더는 이름그대로 버텍스를 처리하는 쉐이더로 쉐이더라 라이팅만 처리하는것이 아닌 트랜스폼 처리또한 버텍스 쉐이더에서 이루어진다.

앞에서 정리한 월드 트랜스폼, 뷰 트랜스폼, 프로젝션 트랜스폼은 합쳐서 월드-뷰-프로젝션 트랜스폼이라 부르며

 

이런 월드-뷰-프로젝션 트랜스폼은 버텍스 쉐이더에서 메시의 버텍스 매트릭스에 곱해줌으로 수행된다.

 

-지오메트리 생성

버텍스 쉐이더는 버텍스를 처리하는 단계로 즉 도형의 점들만을 처리한다. 버텍스 쉐이더를 거치고나면 버텍스들이 연결되어 선을 이루고 도형의 형태가되는데 그래픽스에서 이러한 메시도형의 형태를 지오메트리라고 부른다.

지오메트리의 생성은 버텍스 쉐이더에서 버텍스들의 트랜스폼이 결정되고 나면 다음단계에서 자동으로 이루어진다.

 

  • 래스터라이저 스테이지

 래스터라이저 스테이지에서는 오브젝트를 그리는 픽셀을 추리고 픽셀의 색을 결정한다. 버텍스 쉐이더를 거쳐 지오메트리들이 구축되면 화면(또는 버퍼)의 어느 픽셀에 그려져야하는지를 결정한다.

메시의 폴리곤에 속한 영역을 픽셀로 매칭시키는 과정을 래스터라이제이션이라 부른다.

래스터라이제이션이 이루어지고 나면 마지막으로 화면에 그려질 픽셀의 색상이 결정된다.

즉 래스터라이저 스테이지는 렌더링 하는 메시가 화면 매칭되는 픽셀을 정하고 색을 입히는 과정이다.

 

-뎁스 버퍼(Depth Buffer), Z 버퍼(Z buffer)

프래그먼트(혹은 픽셀) 쉐이더에서 결정된 픽셀의 최족 색상정보는 컬러 버퍼에 저장되며 이는 R,G,B,Alpah 4가지 채널의 값이 저장되며 컬러 버퍼 이외에도 픽셀의 깊이값을 별도의 버퍼에 저장하는데 깊이값은 카메라로부터의 거리를 의미하며 이를 Z 버퍼 혹은 뎁스 버퍼라고 부른다. 이 Z버퍼를 이용해 픽셀이 렌더링 될때마다 깊이 판정을 수행한다.

 

-프래그먼트 쉐이더(Fragment Shader)

프래그먼트 쉐이더는 픽셀 쉐이더라 불리기도 하며 프래그런트랑 화면상에서 최종 픽셀이 되기 전의 데이터를 의미한다. 프래그먼트 쉐이더는 픽셀의 최종 렌더링 색을 계산하며 이 단계에서 텍스처로부터 색상을 읽어 적용하고, 그림자를 적용하는 등 다양한 처리를 한다.

 

-블렌딩(Blending)

투명도를 가지는 오브젝트라면 픽셀을 렌더링할때 알파 블렌딩 과전을 거친다. 알파 블렌딩은 쉐이더에서 결정되는 알파값을 사용하여 해당 픽셀 출력의 알파값을 사용해 해당 픽셀의 컬러 버퍼의 기존값과 적저랗게 혼합하여 최종 출력 색상을 결정한다.

 

  • 더블 버퍼링

화면에 렌더링될 모든 요소가 이러한 파이프라인을 거쳐 해당 프레임의 컬러 버퍼가 완성되고 나면 컬러 버퍼를 화면에 출력한다. 이때 버퍼가 2개 존재하는데 이를 더블 버퍼링이라 한다.

예를들어 1번 버퍼와 2번 버퍼라 칭하면 1번 버퍼가 화면에 출력되는동안 2번 버퍼에 다음프레임을 렌더링하며 2번 버퍼의 갱신이 끝나면 2번 버퍼를 화면에 출력하고 1번 버퍼에 프레임을 렌더링 한다. 이와같이 두개의 버퍼를 번갈아가면서 렌더링 한 후 화면에 보여주기 때문에 우리눈에는 오브젝트가 순차적으로 화면에 렌더링되는것이 아닌 화면이 한번에 갱신되는것처럼 보이게 한다.

 

이때 현재 화면에 출력되는 버퍼를 프론트 버퍼(Front-Buffer) 렌더링되는 버퍼를 백 버퍼(Back-Buffer)라고 부른다.