[Unreal Engine] Unreal Engine's Rendering Pipeline

Imeamangryang·2025년 6월 27일
post-thumbnail

출처 : staticJPL - Render-Dependency-Graph-Documentation


Unreal Engine's Rendering Pipeline

언리얼의 렌더링 파이프라인에 대해 알아보기 전에 Rendering pass와 Deferred rendering의 개념에 대해 알아볼 필요가 있습니다.

Rendering pass는 GPU에서 실행되는 하나에서 여러 개의 드로우 호출로 구성된 집합입니다. 일반적으로 많은 Draw calls은 적절한 실행 순서를 보장하기 위해 함께 그룹화됩니다. 이는 이전 패스의 출력이 다른 순차적 패스의 입력으로 사용될 수 있기 때문입니다.

Deferred rendering은 라이트와 머티리얼을 별도의 패스로 렌더링하는 언리얼의 기본 메서드입니다. 이 별도의 패스는 베이스 패스가 불투명도, 스페큘러, 디퓨전, 노멀 등의 주요 정보에 대한 정보를 축적할 때까지 기다립니다. 아래 예시는 디퍼드 렌더링이 어떻게 작동하는지 보여줍니다.

언리얼은 래스터화할 때 각 픽셀의 라이팅과 셰이딩을 계산하는 대신 디퍼드 렌더링을 사용하여 씬의 지오메트리에 대한 정보를 “화면 밖”의 GBuffer에 캡처합니다. 이 버퍼는 씬에 라이팅과 셰이딩을 적용하기 위해 두 번째 패스에 사용됩니다. 이 버퍼의 장점은 GPU를 보다 효율적으로 사용할 수 있다는 것입니다.

지오메트리를 조명과 셰이딩에서 분리하면 GPU가 많은 수의 조명과 효과를 동시에 처리할 수 있으므로 성능이 향상될 수 있습니다. 따라서 Dynamic lighting과 복잡한 조명 설정에 유연성을 제공합니다.

Pass Order in Unreal Engine

이 패스는 변경될 수 있지만 일반적으로 이 순서대로 진행됩니다. RenderDoc을 다운로드하고 엔진 검증을 직접 해보는 것을 추천합니다

Base Pass

  • Opaque or Masked materials의 최종 Attribute를 G-Buffer에 렌더링
  • Static lighting을 읽고 G-Buffer에 저장
  • DBuffer 데칼 적용
  • 안개(Fog) 적용
  • Final velocity 계산 (from packed 3D velocity)
  • Forward renderer에서의 Dynamic lighting

Deferred mode에서 Base Pass는 머티리얼의 프로퍼티를 나중에 라이팅 계산을 위해 GBuffer defers에 저장합니다.

Geometry Passes

Geometry Passes는 라이팅 전에 메시를 그리고 우선순위를 지정하는 곳입니다.

PrePass

투명도에 따라 메시를 최적화하는 데 사용되는 Depth Z-Buffer의 PreRendering입니다. 이는 다른 메시 뒤에 숨겨져 보이지 않는 메시를 최적화하며 “Culling”(렌더링하지 않음)이라고 하는 방법입니다.

HZB

  • 계층적 Z-버퍼(Hierarchical Z-Buffer, HZB)를 생성합니다.

HZB는 오클루전 컬링(occlusion culling) 기법과 화면 공간(Screen Space)에서의 앰비언트 오클루전 및 반사와 같은 기술에 사용됩니다.

Render Velocities

  • 각 버텍스의 속도를 저장합니다. (나중에 Motion blur 및 Temporal anti-aliasing에 사용).

Velocity는 움직이는 모든 버텍스의 속도를 측정하여 모션 블러 속도 버퍼에 저장하는 버퍼입니다. Velocity buffer는 현재 프레임과 다음 프레임의 차이를 비교하여 마스크를 생성합니다. Doom 2016에서는 이 Velocity buffer를 사용하여 씬에서 정적이지 않은 메시를 마스킹하는데, 이는 다음 프레임에서 움직이지 않는 메시의 렌더링을 최적화하는 영리한 방법입니다.

Lighting Pass

이 부분은 프레임에서 가장 연산량이 많은 단계로, 특히 많은 동적 및 그림자 광원이 있을 때 더욱 그렇습니다.

직접 조명(Direct Lighting)

  • 포워드 셰이딩에서 최적화된 조명 처리

그림자가 없는 광원(Non-Shadowed Lights)

  • 그림자를 생성하지 않는 디퍼드 렌더링의 광원

그림자가 있는 광원(Shadowed Lights)

  • 동적 그림자를 생성하는 광원

그림자 깊이(Shadow Depths)

  • 그림자를 생성하는 광원을 위한 깊이 맵 생성

Shadow Projection

  • 그림자의 최종 렌더링

간접 조명(Indirect Lighting)

  • 화면 공간 앰비언트 오클루전(SSAO)
  • 데칼(Non-Buffer 타입)

라이팅 이후 합성(Composition After Lighting)

  • Subsurface scattering 처리

반투명 및 라이팅(Translucency and lighting)

  • 반투명 머티리얼 렌더링
  • Surface Forward Shading을 사용하는 머티리얼의 라이팅 처리

반사(Reflections)

  • 리플렉션 캡처 액터의 결과를 전체 화면 리플렉션 버퍼에 읽고 블렌딩

스크린 공간 반사(Screen Space Reflections)

  • 실시간 동적 반사
  • 포스트 프로세스에서 스크린 공간 레이 트레이싱 기법으로 처리

포스트 프로세싱(Post Processing)
렌더 파이프라인의 마지막 패스로, 이후에 삼각형을 그릴 때 이 부분을 활용하게 됩니다.

  • 피사계 심도(Depth of Field, BokehDOFRecombine)
  • 템포럴 안티앨리어싱(TemporalAA)
  • 속도 값 읽기(VelocityFlatten)
  • 모션 블러(MotionBlur)
  • 자동 노출(PostProcessEyeAdaptation)
  • 톤 매핑(Tonemapper)
  • 렌더링 해상도에서 디스플레이 해상도로 업스케일링(PostProcessUpscale)
profile
언리얼 엔진 주니어 개발자 입니다.

0개의 댓글