[UE5] DeferredRenderer

윤정민·2026년 7월 19일

Unreal Engine

목록 보기
38/38

디퍼드 렌더링

문제 상황

포워드 렌더 시 각 메시를 래스터화 한다.
이때, 픽셀에 영향을 미치는 라이트를 순회하게 되면서 픽셀 수 × 픽셀당 라이트 수에 비례하는 비용이 발생한다.
따라서, 최종적으로 보이지 않는 픽셀까지 라이팅을 수행하는 불필요한 연산이 발생한다.

해결 방안

디퍼드에서는 해당 계산을 분리한다.

1. Base Pass

  • 메시를 한 번 래스터화하면서 라이팅은 수행하지 않는다.
  • 대신 머티리얼 속성(베이스 컬러, 노멀, 메탈릭, 스페큘러, 러프니스, 셰이딩 모델 등)을 화면 크기의 여러 렌더 타깃(G-Buffer)에 저장한다.

2. Lights

  • G-Buffer를 읽어 화면 공간(Screen Space)에서 라이팅을 수행한다.
  • 각 화면 픽셀의 G-Buffer 정보를 이용해 모든 라이트의 영향을 계산하고 결과를 누적하여 최종 색상을 생성한다.
  • 이 과정은 이미 화면에 보이는 픽셀만 대상으로 수행되므로, 기하(Geometry)의 복잡도와 독립적으로 라이팅을 처리할 수 있다.

최종 문제 해결

라이팅 비용은 화면에 보이는 픽셀 수와 라이트 수에 주로 영향을 받으며, 메시를 다시 렌더링하지 않기 때문에 기하 복잡도와 분리된다.

Pipeline

1. InitViews

  • 프레임 시작에서 뷰 별로 가시성을 결정
  • 프러스텀, 오클루전 등을 통해 가시여부 판단
  • 동적 셰도우, 라이트가시성, 메시 드로우 커멘드 준비 뷰 유니폼 버퍼 구성

2. PrePass

  • 불투명 지오메트리의 깊이만 먼저 그려 깊이 버퍼를 채움
  • 이후 BasePass에서 가려질 픽셀의 PS를 GPU의 early-Z 테스트에서 사전 컬링
    • BasePass의 오버드로우를 줄임

3. BasePass

  • 불투면/마스트 메시를 래스터화하면서 라이팅하지 않고 머티리얼 속성을 MRT(Multiple RenderTargets)로 GBuffer에 출력

4. ShadowDepths

  • 라이팅 전 그림자 정보를 준비하는 단계
  • 각 그림자 캐스팅 라이트에 대해 라이트 시점의 깊이를 그려 셰도우 깊이맵을 만듦 (Virtual Shadow Map)
  • 라이팅 단계에서 라이트 별로 이 깊이 맵을 샘플링해 가시성을 구함

5. Light

  • GBuffer를 읽어 화면 공간에서 라이트를 SceneColor에 가산 누적
  • 픽셀당 한번의 GBuffer 디코드 + 라이트별 누적 계산이 필요

6. Translucency

  • GBuffer에 반투명을 인코딩할 수 없으니 (여러 표면이 한 픽셀에 겹침) Forward 방식으로 그림
  • 라이팅 된 후 SceneColor 에 블렌딩 하는 방식

7. PostProcess

  • 라이팅 된 HDR Scene Color에 적용되는 패스
  • MotionBlur, DOF, Bloom, ToneMapping 등

profile
그냥 하자

0개의 댓글