본문 바로가기

포스트 프로세스 볼륨 Post Process Volume

@iamrain2025. 12. 19. 22:02

1. 포스트 프로세스 볼륨 (Post Process Volume)

포스트 프로세스(Post-Process)란 3D 씬의 렌더링이 완료된 후, 최종적으로 화면에 출력되기 전에 이미지 전체에 적용되는 효과들을 의미합니다. 이는 마치 사진 작가가 사진을 찍은 후 보정 작업을 하는 것과 유사하며, 게임의 시각적 퀄리티와 분위기를 결정하는 데 매우 중요한 역할을 합니다.

포스트 프로세스 볼륨(Post Process Volume)은 언리얼 엔진에서 포스트 프로세스 효과를 특정 공간에 적용하거나 맵 전체에 걸쳐 일관되게 적용할 수 있도록 하는 액터(Actor)입니다. 개발자는 이 볼륨을 통해 노출, 색 보정, 블룸(Bloom), 피사계 심도(Depth of Field) 등 다양한 시각 효과를 제어하여 원하는 아트 스타일과 분위기를 연출할 수 있습니다.

2. 핵심 개념 및 작동 원리

포스트 프로세스 볼륨의 동작을 이해하기 위해서는 볼륨 기반 적용 방식과 여러 볼륨이 존재할 때의 블렌딩(Blending) 메커니즘을 알아야 합니다.

2.1. 볼륨 기반 적용 (Volume-based Application)

포스트 프로세스 볼륨은 카메라의 위치에 따라 효과의 적용 여부가 결정됩니다. 두 가지 주요 모드로 나뉩니다.

  • Bound (유한): 볼륨이 가진 경계(Bound) 내에 카메라가 들어왔을 때만 효과가 활성화됩니다. 이는 동굴, 건물 내부, 수중 등 특정 지역에만 다른 시각적 효과를 적용하고 싶을 때 유용합니다. 예를 들어, 물속에 들어가면 화면이 파랗게 변하고 왜곡이 생기는 효과를 구현할 수 있습니다.
  • Unbound (무한): Infinite Extent (Unbound) 옵션이 활성화되면, 볼륨의 경계와 상관없이 맵 전체에 효과가 적용됩니다. 이를 '글로벌 포스트 프로세스 볼륨'이라고도 부르며, 레벨의 전반적인 기본 톤앤매너(Tone and Manner)를 설정하는 데 사용됩니다.

2.2. 블렌딩 (Blending)

하나의 씬에는 여러 개의 포스트 프로세스 볼륨이 존재할 수 있습니다. 언리얼 엔진은 다음과 같은 속성들을 사용하여 여러 볼륨의 설정을 지능적으로 혼합(블렌딩)합니다.

  • Priority (우선순위):
    • 카메라가 여러 볼륨의 영향권 안에 동시에 있을 때, 어떤 볼륨의 설정을 우선적으로 적용할지 결정하는 수치입니다.
    • Priority 값이 높을수록 우선순위가 높습니다. 예를 들어, Priority 0인 글로벌 볼륨과 Priority 1인 작은 동굴 볼륨이 있다면, 카메라가 동굴 안에 있을 때는 동굴 볼륨의 설정이 글로벌 볼륨의 설정을 덮어쓰게 됩니다.
    • 카메라 컴포넌트 자체에도 포스트 프로세스 설정이 있는데, 이는 모든 볼륨보다 높은 최상위 우선순위를 가집니다.
  • Blend Radius (블렌드 반경):
    • 카메라가 볼륨의 경계에 접근할 때, 효과가 갑자기 나타나거나 사라지지 않고 부드럽게 전환되도록 하는 영역입니다.
    • 예를 들어, Blend Radius가 100이라면, 볼륨 경계로부터 100 유닛 거리만큼 떨어진 지점부터 효과가 서서히 적용되기 시작하여 볼륨 안으로 완전히 들어오면 100% 적용됩니다.
  • Blend Weight (블렌드 가중치):
    • 해당 볼륨의 효과를 전체적으로 얼마나 강하게 적용할지 결정하는 0과 1 사이의 값입니다.
    • 1이면 모든 설정이 100% 적용되고, 0.5이면 50%만 적용됩니다. 이 값은 블루프린트나 C++ 코드를 통해 동적으로 제어하여 게임 상황에 따라(예: 플레이어가 피격당했을 때 화면 색상 변경) 효과를 조절하는 데 사용될 수 있습니다.

3. 주요 포스트 프로세스 세팅 상세

FPostProcessSettings 구조체에 포함된 주요 속성들은 다음과 같습니다.

3.1. Lens (렌즈)

카메라 렌즈를 통해 발생하는 물리적인 현상을 시뮬레이션합니다.

  • Bloom (블룸): 이미지의 밝은 부분이 주변으로 빛 번짐 효과를 일으키는 현상입니다. 네온사인, 태양, 폭발 효과 등을 더욱 사실적으로 표현해 줍니다. 내부적으로는 밝기 임계값을 넘는 픽셀들만 추출하여 여러 번의 다운샘플링과 가우시안 블러(Gaussian Blur)를 적용한 후, 원본 이미지와 다시 합치는 방식으로 구현됩니다.
  • Exposure (노출): 사람의 눈이나 카메라가 빛의 양에 따라 동공/조리개를 조절하는 것처럼 장면의 전체적인 밝기를 조절합니다. 'Auto Exposure' 모드를 사용하면 화면의 평균 밝기에 따라 동적으로 노출 값을 조절하여 어두운 곳에서 밝은 곳으로 나갈 때 눈이 적응하는 듯한 효과를 낼 수 있습니다.
  • Depth of Field (피사계 심도): 특정 거리에 있는 피사체에 초점을 맞추고, 그 외의 배경이나 전경을 흐리게 만드는 효과입니다. 영화적인 연출이나 플레이어의 시선을 특정 오브젝트로 유도할 때 효과적입니다. 고품질의 DOF는 성능 소모가 크며, 보통 가우시안, 보케(Bokeh), 서클(Circle) DOF 등 다양한 알고리즘을 선택할 수 있습니다.
  • Lens Flares (렌즈 플레어): 태양과 같은 매우 강한 광원을 바라볼 때 렌즈 내부의 반사로 인해 생기는 빛의 고스트(Ghost)나 줄기 효과를 시뮬레이션합니다.

3.2. Color Grading (색 보정)

장면의 전체적인 색감과 분위기를 조절합니다.

  • White Balance (화이트 밸런스): Temp(색온도)와 Tint(색조)를 조절하여 장면의 기준이 되는 흰색을 설정합니다. 이를 통해 차갑거나 따뜻한 느낌을 연출할 수 있습니다.
  • Global, Shadows, Midtones, Highlights: 장면을 톤(밝기)에 따라 전역, 어두운 영역, 중간 영역, 밝은 영역으로 나누어 각각의 채도(Saturation), 대비(Contrast), 감마(Gamma), 색상(Gain, Offset) 등을 정교하게 조절할 수 있습니다.
  • LUT (Look-Up Table): 색상 보정 값을 미리 계산하여 텍스처 형태로 저장해 둔 것입니다. 포토샵이나 다빈치 리졸브 같은 외부 툴에서 작업한 복잡한 색 보정 결과를 룩업 테이블 텍스처 하나로 게임에 동일하게 적용할 수 있어 매우 효율적이고 강력합니다.

3.3. Rendering Features (렌더링 기능)

  • Ambient Occlusion (앰비언트 오클루전): 물체가 맞닿거나 구석진 곳에 추가적인 그림자를 생성하여 입체감과 사실감을 더해주는 기술입니다. 화면 공간 정보(Screen Space)를 기반으로 계산하는 SSAO(Screen Space Ambient Occlusion)가 널리 사용됩니다.
  • Global Illumination (글로벌 일루미네이션): 빛이 표면에 반사되어 다른 표면을 비추는 간접광을 계산합니다. 언리얼 엔진 5의 Lumen 시스템이 이에 해당하며, 포스트 프로세스 볼륨에서 Lumen의 품질과 세부 설정을 제어할 수 있습니다.
  • Motion Blur (모션 블러): 빠르게 움직이는 오브젝트나 카메라의 움직임에 따라 잔상 효과를 주어 역동성을 강조합니다. 픽셀의 현재 프레임 위치와 이전 프레임 위치를 비교하여 그 차이만큼 이미지를 번지게 하는 방식으로 구현됩니다.

4. 내부 구조 및 렌더링 파이프라인

4.1. 계층 구조

사용자 레벨에서부터 엔진 내부까지의 계층은 다음과 같습니다.

  1. APostProcessVolume (Actor): 레벨에 배치되는 액터입니다. 위치, 크기, 블렌딩 속성 등을 가집니다.
  2. UPostProcessComponent (Actor Component): APostProcessVolume에 포함된 컴포넌트로, 실제 포스트 프로세스 효과에 대한 모든 설정 값을 가지고 있습니다.
  3. FPostProcessSettings (Struct): UPostProcessComponent 내부에 선언된 구조체입니다. 블룸, DOF, 색 보정 등 수많은 포-스트 프로세스 속성들이 이 구조체 안에 변수로 정의되어 있습니다.
  4. FSceneView (View): 렌더링 스레드에서 현재 씬을 어떤 관점에서 렌더링할지를 정의하는 객체입니다. 렌더링할 때마다 현재 카메라 위치를 기준으로 적용될 모든 포스트 프로세스 볼륨들을 수집합니다.
  5. FPostProcessChain (Rendering): 수집된 모든 볼륨의 FPostProcessSettings를 Priority, Blend Weight 등을 고려하여 최종적으로 적용될 단일 FPostProcessSettings로 블렌딩하는 역할을 합니다.
  6. Post Process Shaders (.usf): 최종 블렌딩된 설정을 입력받아, GPU에서 실제 연산을 수행하는 셰이더 코드들입니다. (PostProcessBloom.usf, PostProcessTonemapper.usf 등)

4.2. 렌더링 파이프라인 (Deferred Rendering 기준)

포스트 프로세스는 주로 지연 렌더링(Deferred Rendering) 파이프라인의 마지막 단계에서 수행됩니다.

  1. G-Buffer Pass: 씬의 모든 오브젝트를 렌더링하여 화면 공간상의 위치, 노멀, 알베도(기본 색상), 러프니스 등 렌더링에 필요한 정보들을 여러 장의 텍스처(G-Buffer)에 저장합니다.
  2. Lighting Pass: G-Buffer의 정보를 사용하여 각 픽셀에 대한 직접광 계산(라이팅)을 수행합니다. 이 결과로 최종 씬 컬러(Scene Color) 텍스처가 생성됩니다.
  3. Post-Processing Pass: 바로 이 단계에서 포스트 프로세스가 적용됩니다.
    • 앞서 생성된 씬 컬러 텍스처를 입력으로 받습니다.
    • FPostProcessChain에 의해 결정된 최종 설정을 바탕으로, 톤 매핑(Tonemapping), 블룸, DOF, 색 보정 등의 효과들이 순차적으로 적용됩니다. 각 효과는 하나 이상의 셰이더 패스로 구성되며, 이전 단계의 결과물을 입력으로 받아 새로운 결과물을 출력하는 연쇄적인 구조를 가집니다.
    • 모든 효과가 적용된 최종 이미지가 백 버퍼(Back Buffer)에 기록되고, 화면에 표시됩니다.

5. 성능 및 최적화

포스트 프로세스는 이미지 전체에 적용되는 만큼 성능에 큰 영향을 줄 수 있습니다.

  • 고비용 효과: 피사계 심도(특히 고품질 보케), 모션 블러, 스크린 스페이스 리플렉션(SSR), Lumen GI/반사는 대표적인 고비용 효과입니다.
  • 최적화 전략:
    • 품질 설정 조절: sg.PostProcessQuality 같은 콘솔 변수를 통해 전반적인 품질을 조절하거나, r.BloomQuality, r.DepthOfFieldQuality 등 개별 효과의 품질을 낮출 수 있습니다.
    • 불필요한 효과 비활성화: 사용하지 않는 효과는 반드시 비활성화하여 GPU 부담을 줄여야 합니다. 예를 들어, Vignette Intensity를 0으로 설정하는 것만으로도 해당 패스를 건너뛸 수 있습니다.
    • Bound 볼륨 활용: Unbound 볼륨은 항상 씬 전체를 고려해야 하므로, 가능한 특정 지역에만 효과를 주는 Bound 볼륨을 사용하는 것이 효율적입니다.
    • 프로파일링: 언리얼 엔진의 GPU Visualizer (stat gpu 명령어로 실행)를 사용하여 각 포스트 프로세스 패스가 GPU 시간을 얼마나 차지하는지 분석하고 병목 지점을 찾아 최적화해야 합니다.

6. 사용 사례 및 비교

구분 범위 우선순위 주요 사용 사례
Bound Volume 볼륨 경계 내부 Priority 값에 따라 결정 특정 지역의 분위기 연출 (수중, 동굴, 건물 내부 등)
Unbound Volume 맵 전체 (무한) Priority 값에 따라 결정 레벨의 전반적인 톤앤매너, 기본 룩앤필(Look & Feel) 설정
Camera Settings 해당 카메라에 항상 적용 가장 높음 (모든 볼륨을 덮어씀) 컷신 연출, 플레이어 피격/사망 시 화면 효과, 특정 스킬 사용 시 시각 효과 등

 

iamrain
@iamrain :: Annals of Unreal

iamrain 님의 블로그 입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차