Portfolio

PROJECT CASE STUDY

RDG.RHI

Unreal Engine 5의 RHI 리소스 생성부터 Render Dependency Graph 기반 커스텀 렌더 패스와 Mesh Pass까지 확장한 GPU 프로그래밍 프로젝트입니다.

Unreal Engine 5RDGRHIC++HLSLRender Pass

프로젝트 개요

RDG.RHI는 두 개의 Unreal Engine 프로젝트를 하나의 GPU 프로그래밍 학습·실험 프로젝트로 정리한 작업입니다. Unreal Engine의 렌더링 파이프라인에 직접 진입해 RHI 레벨의 버퍼와 Vertex Declaration을 만들고, Scene View Extension과 RDG 패스로 커스텀 셰이더를 화면에 연결했습니다.

UE5_GPUProgramming에서는 RHI 리소스와 Global Shader, 후처리 효과를 단계별 플러그인으로 구현했습니다. UE5-RDG-Sample에서는 같은 흐름을 Render Dependency Graph와 커스텀 Mesh Pass 구조로 확장했습니다.

기술 스택

  • Unreal Engine 5
  • C++, RHI, RenderCore, Renderer
  • Render Dependency Graph, FRDGBuilder
  • HLSL, USF Global Shader
  • Scene View Extension, Render Thread
  • Vertex Buffer, Index Buffer, Vertex Declaration
  • Shader Parameter Struct, GPU Event·Stat Scope

RHI 리소스와 Global Shader

HelloTriangle 플러그인에서 CPU의 정점 데이터를 TResourceArray로 구성하고 FRHIBufferCreateDesc를 통해 Vertex Buffer와 Index Buffer를 생성했습니다. Vertex Declaration을 Pipeline State Cache에서 만들고, RHI 리소스의 초기 상태와 사용 플래그를 지정해 GPU가 읽을 수 있는 입력 구조를 구성했습니다.

Global Shader 클래스는 Shader Parameter Struct와 Vertex·Pixel Shader로 분리했습니다. 플러그인 시작 시 Shader Source Directory를 매핑하고, USF 파일의 진입점을 Unreal Shader 시스템에 등록해 C++ 파라미터와 HLSL 입력을 연결했습니다.

Scene View Extension과 후처리 패스

HelloTriangle, JustSnow, Vignette 플러그인은 FSceneViewExtensionBase를 상속해 렌더 스레드의 지정된 시점에 개입합니다. Scene Color와 View 정보를 가져오고, Global Shader 파라미터를 채운 뒤 화면 전체 삼각형 또는 AddDrawScreenPass를 이용해 결과를 출력합니다.

JustSnow는 시간, 마우스 위치, 레이어 수, 깊이, 폭, 속도를 파라미터로 받아 절차적으로 눈 레이어를 계산합니다. Vignette는 Scene Texture를 샘플링해 화면 가장자리의 밝기를 조절합니다. 두 효과 모두 CVAR로 패스를 켜고 끌 수 있어 렌더 패스의 동작을 비교하고 디버깅할 수 있습니다.

RDG 기반 렌더링 구조

UE5-RDG-Sample에서는 렌더링 기능을 플러그인 단위로 분리했습니다. LearnShader와 TriangleShader는 Global Shader와 Scene View Extension을 이용해 간단한 셰이더와 전체 화면 삼각형 패스를 추가하고, AddMeshPass는 Material Shader와 Mesh Pass Processor를 통해 엔진의 메시 패스 흐름에 연결됩니다.

FRDGBuilder에서 패스 파라미터를 할당하고, Scene Texture를 조회하거나 외부 Render Target을 RDG Texture로 등록했습니다. GraphBuilder.AddPass에 패스 실행을 등록하고, RDG_EVENT_SCOPE와 GPU 통계 범위로 실행 구간을 추적했습니다. 이 구조를 통해 리소스 의존성과 렌더 패스 순서를 코드에서 명확하게 표현할 수 있었습니다.

구현에서 얻은 경험

RHI는 GPU 리소스와 파이프라인 상태를 직접 다루는 기반 계층이고, RDG는 그 리소스와 패스의 의존성을 엔진 렌더링 흐름에 안전하게 연결하는 계층입니다. 두 저장소를 함께 정리하면서 CPU 데이터가 Vertex·Index Buffer를 거쳐 셰이더 파라미터로 전달되고, Scene View Extension에서 RDG 패스로 실행되는 전체 경로를 확인했습니다.

또한 기능을 플러그인으로 분리하면 엔진 소스 자체를 수정하지 않고도 셰이더, 후처리, 메시 패스를 독립적으로 실험할 수 있다는 점을 확인했습니다. 학습용 삼각형에서 시작해 화면 효과와 커스텀 메시 패스로 확장하는 과정을 통해 Unreal Engine 렌더링 코드의 진입 지점과 책임을 정리했습니다.

저장소