유니티 엔진을 만지다 보면, 3D 오브젝트를 배치하고 조명을 추가하면서 게임의 퀄리티를 높입니다.
하지만 사실 화면을 그리고, 빛과 그림자를 처리하는 작업을 하는 [렌더링 엔진]이라는 친구가 있습니다.
이번 포스트에서는 렌더링 엔진과 렌더링 파이프라인에 대해 작성해 보도록 하겠습니다.
렌더링 엔진은 컴퓨터 그래픽스에서 3D 모델을 그리기 위한 핵심 소프트웨어 구성입니다.
게임 속에서 캐릭터, 배경 등의 이펙트를 볼 수 있는 건, 렌더링 엔진이 모두 계산해서 보여준 결과물입니다.
렌더링 엔진은 다음과 같은 작업을 진행합니다.
렌더링 엔진은 렌더링 파이프라인이라는 친구를 구현합니다. 예를 들어, 정점을 어떻게 처리할 지, 색상은 어떻게 해야할 지 계산하는 것들은 렌더링 엔진이 짭니다.
차로 비유하면 렌더링 엔진은 자동차 틀이며, 렌더링 파이프라인은 엔진 내부에서 연료가 소모되고 동력이 전달되는 경로를 뜻하죠.
아래에서 렌더링 파이프라인에 대해 자세히 다뤄보도록 하겠습니다.
렌더링 파이프라인은 위에서 간단하게 설명한 것처럼, 3D 데이터를 화면에 그리기까지의 "처리 흐름"을 말합니다. 즉, 컴퓨터 그래픽스에서 3D모델을 화면에 그리는 과정을 나타내는 개념을 나타내죠.
렌더링 파이프라인은 여러 단계로 구성되어 있습니다.
입력 어셈블리는 3D 모델의 정점(vertex) 데이터들을 GPU에게 보낼 준비를 하는 단계입니다. 3D 모델의 기본 구성 요소를 메모리에서 로드하고, 이를 정렬합니다.
위에서 입력받은 정점 데이터들을 처리하고 계산하는 단계입니다. 정점 쉐이더는 화면에 표시될 위치, 색상 및 기타 속성을 계산하며, 3D 공간에서는 변환, 조명, 텍스쳐 매핑 또한 포함합니다.
기하 쉐이더는 삼각형, 선, 점 등의 형태를 생성하거나 수정할 수 있는 단계입니다. 새로운 삼각형을 추가하거나, 원래 모양을 변형하거나, 복잡한 모양을 즉석해서 만들어 낼 수 있습니다.
기하 쉐이더의 경우에는 선택적 단계입니다. 기본 3D 렌더링은 정점 쉐이더와 픽셀 쉐이더만으로 충분하기 때문에, 기하 쉐이더 단계는 건너뛰어도 무방합니다.
라스터라이저는 3D 공간에 존재하는 도형을 2D 픽셀로 변환해 주는 단계입니다. 주로 3D 모델을 2D로 변환한 후, 3D 좌표를 2D 화면에 정확하게 변환하여 어떤 픽셀을 칠해야 하는지 결정해주는 역할을 합니다.
픽셀 쉐이더는 라스터라이저로부터 생성된 픽셀 데이터를 받아서 그림자, 빛, 텍스쳐 등을 반영한 최종 색상을 계산하는 단계입니다.
출력 병합은 픽셀 쉐이더에서 최종적으로 계산된 픽셀 데이터를 버퍼에 합성시키는 역할을 합니다. 출력 병합 단계에서 반투명한 물체같은 색깔을 섞고, 깊이를 테스트하는 역할을 수행합니다.
유니티에서는 간편하게 3D 오브젝트를 만들고 조명을 설치했지만, 렌더링 엔진과 렌더링 파이프라인을 공부하고 난 후 매우 어지럽다는 생각이 듭니다. 유니티를 또 숭배해야만 하는 이유가 늘었네요.