GPU

오랜만에 렌더링 파이프 라인 주제로 돌아왔습니다. 예전에 한번 언급 드렸지만 3차원의 도형이 2차원의 픽셀 이미지로 표현되기까지 과정을 실시간 렌더링 파이프 라인이라고 표현 합니다. 현재 언리얼 엔진에서 공식적으로 작성된 실시간 렌더링 파이프 라인의 기준으로 순서를 따라가면서 가이드 라인을 정리 하고 있고, CPU와 DRAW를 거쳐 GPU에서 Geometry를 그리는 단계로 진입하였습니다.
Early z Pass(Prepass & Depth)
GPU에서 Geometry를 그리는 과정은 오브젝트 단위로 이루어집니다. 기둥과 조각상의 두개의 오브젝트가 있고, 기둥 앞에 조각상이 그려지는 이미지의 경우는 GPU는 기둥과 조각상을 두번을 그리는 작업을 수행합니다. 그래서 같은 도형이 겹쳐있는 상태의 이미지를 그리는 수행을 한다면 컴퓨터는 두개의 도형을 각각 계산해서 그리게 됩니다. 최종적으로 픽셀 이미지로 변환이 되면 동일한 픽셀을 여러번 렌더링하는 비용이 발생합니다. 이러한 개념을 OverDraw라고 표현합니다.
Early z Pass는 언리얼 엔진에서 지오메트리를 그리는 과정에서 불필요한 비용을 줄이는 작업을 수행하는 역할을 합니다. 물체에 투사된 픽셀의 깊이 값이 카메라와 거리를 나타내는 z Buffer에 저장이 됩니다. CPU 단계에서 오브젝트를 그리기 위한 위치 확인 작업이 수행되었으니, Early z Pass를 마스크로 활용하여 불필요한 비용을 줄이는 과정을 거칩니다.


Geomerty Rendering
Geometry Rendering에서는 얼리언 엔진에서 Geometry의 그려지는 과정의 순서를 다룹니다. 드로우콜이라는 개념으로부터 시작해서, 버텍스 셰이더(Vetex Shader)를 거쳐서 화면에 지오메트리가 그려집니다. 그리고 Rasterize 과정을 통해 지오메트리의 삼각형이 픽셀 그룹으로 단위로 분해 됩니다. 이렇게 분해된 픽셀 그룹은 최종적으로 픽셀 셰이더(Pixel Shader)에서 실행이 됩니다.
Drawcall
드로우콜은 렌더링 되는 지오메트리(Geometry)에서 같은 속성을 공유하는 폴리곤 그룹을 의미합니다. 드로우 콜은 CPU가 GPU에게 오브젝트를 그리도록 명령하는 것과 같습니다. 표현이 좀 복잡해지는 것 같아서 지오메트리에서 같은 속성을 공유하는 폴리곤 그룹을 드로우콜로 이해하시는 쪽이 설명에 나을 것 같습니다. 개별 오브젝트에서 여러개로 있는 머티리얼 또한 별개의 드로우콜로 표현이 됩니다. 폴리곤 그룹마다 다른 머티리얼을 물고 있기 때문에 다른 속성을 가지게 됩니다. 결론적으론 한 개의 Geometry를 그린다면 오브젝트 단위로 드로우콜이 호출되고, 지오메트리에 각각의 매터리얼을 그리는데 또한 드로우콜이 호출되게 됩니다.



언리얼 엔진에서는 오브젝트에 지오메트리 표현 있는 비주얼적인 요소의 렌더링에 사용되는 부가적인 오브젝트를 붙힐 수 있는데, 이를 프리미티브 컴포넌트(Primitive Component)라고 부릅니다. 이 프리미티브 컴포넌트도 별도의 드로우콜 가지게 됩니다.

Vertex Shader
Vertex Shader는 Geometry를 GPU로 불러오는 과정에서 이루어지는 정점 관련 출력 값을 나타냅니다. Gpu는 Geometry를 불러와서 정점을 연결하여 삼각형을 구성하며 도형을 만듭니다. Vertex Shader에서는 Geometry의 Vertex의 값을 Local 값에서 World 값으로 변환하는 역할을 합니다.


또한 DCC에서 작업된 Geometry의 Vertex Color에 관련된 처리 작업 및 특정 면의 그룹을 부드럽게 연결되 보이도록하는 SmootingGroup과 관련된 처리 작업도 Vertex Shader에서 이루어집니다.


추가로 Vertex Shader는 대규모 애니메이션을 구현하는 역할이 가능합니다. 언리얼 엔진에서 애니메이션은 스켈레탈 메시를 이용한 본 구조를 이용한 구현 방법과 다양한 전환이 필요한 경우 애니메이션 블루프린트를 사용하게 됩니다. 그래서 대규모 작업의 애니메이션 처리는 CPU의 작업량이 감당하기 부담스러운 요소로 남습니다. Vetex Shader에서 CPU를 거치지 않고 Vertex를 이동시키는 WorldPositionOffset에 해당되는 방법을 사용하면 상대적으로 저렴한 비용으로 대규모 애니메이션을 구현할 수 있게 됩니다.

Rasterization
Rasterization은 3D 데이터를 2D 픽셀로 매칭 시키는 과정을 말합니다. Vertex를 기준으로 내부에 픽셀을 갱신하는데 필요한 정보(Fragment)를 생성합니다. 픽셀은 모니터 상에서 화면을 구성하는 최소 단위를 의미합니다. FULL HD 해상도를 기준으로 모니터 상에는 200만개 이상의 픽셀이 있고, 각 픽셀이 최소 한번은 처리 되기 때문에 부하를 크게 받을 수 있는 요소입니다. Vertex가 그려지는 모든 픽셀마다 Pixel Shader(Fragment Shader)가 실행되며, Vertex Shader에서 받아온 데이터를 기준으로 Pos, UV, Normal, Color 값들이 보간이 됩니다. 수행은 드로우콜 단위로 실행됩니다.

GPU는 2X2의 픽셀 그룹 단위로 처리에 사용합니다, 특정 Vertex가 화면상에서 1픽셀의 범위 내를 그리고 있다 하더래도 2X2 단위로 비용이 발생하게 됩니다. 2x2의 단위로 연산이 필요한 이유는 MipMap이라고 불리우는 개념 때문인데, 고해상도 텍스쳐와 저해상도 텍스쳐 중에서 비교하여 최적의 Mipmap을 구하기 위해서 사용됩니다. Rasterize 과정에서 실제 화면에 필요한 횟수 이상의 연산을 수행하는 개념을 QuadOverdraw 혹은 OverShading이라고 부릅니다.


'Unreal Pipeline > Rendering Pipeline' 카테고리의 다른 글
| 05 BasePass (G-Buffer & Material) - Unreal Engine (0) | 2026.05.30 |
|---|---|
| 03 Cpu & Draw - Unreal Engine (0) | 2025.09.06 |
| 02 Intro - Unreal Engine (0) | 2025.07.06 |
| 01 Rendering Pipeline Process - Unreal Engine (0) | 2025.04.21 |