Unity Baked Volumetrics
요약
이 기술 기사는 Unity 엔진용 완전히 베이크된 볼륨 광원 그래픽 솔루션을 소개합니다. 이 시스템은 런타임에 가볍고 빠르게 작동하도록 설계되었으며, 라이트맵핑과 유사하게 에디터에서 오프라인으로 베이크됩니다. 다양한 밀도 유형 및 후처리 조정 기능을 제공하여 고품질의 볼륨 안개 효과를 구현할 수 있습니다.
핵심 포인트
- Unity용 완전히 베이크된 볼륨 광원 솔루션입니다.
- 라이트맵핑과 유사하며, 런타임 성능을 위해 에디터에서 오프라인으로 베이크됩니다.
- 다양한 밀도 유형(Constant, Height Based 등) 및 후처리 조정이 가능합니다.
- Built-In Rendering Pipeline 기반이지만 다른 SRP와 호환되도록 조정할 수 있습니다.
Unity Baked Volumetrics
VR용(및 VR 비사용)으로 매우 가볍고 저렴하도록 설계된, 완전히 베이크된 볼륨 광원(volumetric lighting)을 위한 그래픽 솔루션입니다.
결과물 (Results)









기능 (Features)
요약하자면, 이것은 볼륨 안개(volumetric fog)를 위한 라이트맵핑(lightmapping)과 같습니다.
- 런타임에 가볍고 빠르게 작동하도록 설계되었으며, 에디터 내에서 완전히 오프라인으로 베이크되는 완전히 베이크된 볼륨 광원입니다.
- 여러 소스(Light Probes, Light Probe Proxy Volumes, Voxel Tracer)로부터 볼륨 광원을 생성할 수 있습니다.
- 밀도(Density)는 3D 텍스처에 베이크됩니다 (RGB: Color A: Density). 그리고 다양한 밀도 유형을 사용하여 다른 모양을 구현할 수 있습니다 (Constant, Luminance Based, Height Based, Luminance Height Based).
- 후처리 조정(Post Adjustments)을 적용하여 생성된 볼륨의 모양을 미세 조정하고 개선할 수 있습니다. 예를 들어, 품질/부드러움을 향상시키기 위한 분리형 3D 가우시안 블러(Seperable 3D Gaussian Blur)와 밝기(Brightness), 대비(Contrast), 채도(Saturation), 생동감(Vibrance), 색조 이동(Hue Shift), 감마(Gamma), 색 필터(Color Filter), 색 곱셈(Color Multiplication)과 같은 보다 예술적인 제어 기능을 사용할 수 있습니다.
- 다양한 요구 사항에 맞게 동일한 효과의 여러 버전을 제공합니다... (장면 기반 버전 및 여러 후처리 버전)
참고: Built-In Rendering Pipeline을 기반으로 구축되었지만, 다른 SRP(Scriptable Render Pipeline)와 함께 작동하도록 조정할 수 있습니다.
정보 (Information)
작동 방식 (How it works)
시작하려면 장면에 상자 볼륨(box volume)을 정의하고, 해당 위치와 경계(bounds)를 설정합니다. 3D 텍스처의 해상도는 개별 복셀(voxel)의 크기를 결정하여 계산됩니다 (수동으로 사용자 지정 해상도를 설정할 수도 있습니다). 다음으로 장면 광원 프로브(scene light probes), 라이트 프로브 프록시 볼륨(light probe proxy volumes), 또는 복셀 트레이서(voxel tracer)로부터 조명을 샘플링할지 선택할 수 있습니다. 그 후, 볼륨의 안개 밀도(fog density)를 설정하는 옵션이 있습니다 (상수, 휘도 기반, 높이 기반 등). 다음 단계는 디스크에 저장되는 3D 텍스처를 생성하는 것입니다.
셰이더의 경우, 해당 3D 텍스처를 샘플링하고 그 안을 레이마칭(raymarch)하여 장면 깊이 버퍼(scene depth buffer)와 비교합니다. 레이는 다음 중 하나에 해당하면 종료됩니다: 장면에 교차하거나, 범위를 벗어나거나, 밀도(density)가 너무 두꺼운 경우입니다. 또한 레이마칭 과정에서 샘플을 지터링(jitter)하여 품질을 개선합니다. 최종 결과는 투과율(transmittance)을 기반으로 장면 색상 버퍼와 보간(lerp)됩니다.
다양한 구현 방식
이 효과에는 두 가지 버전이 있습니다. 하나는 전형적인 후처리(Post Process) 버전이고, 다른 하나는 **장면 기반 솔루션(Scene Based solution)**입니다...
후처리 V1 (Post Processing V1)
이것은 후처리 방식으로 구현된 효과의 첫 번째 구현체입니다. 작동 방식(How it works) 섹션에 설명된 내용과 정확히 동일하게 작동합니다.
후처리 V2 (Post Processing V2)
이것은 후처리 V2와 유사하지만, 볼륨메트릭스(volumetrics)가 절반 해상도에서 렌더링되고 업샘플링되는 최적화 기능이 추가되었습니다.
장면 기반 (Scene Based)
효과의 첫 번째 구현체는 장면 기반 효과입니다. 이것은 사용자 지정 후처리 효과를 만들 수 없는 상황을 위한 것입니다. 왜 이런 상황이 발생할까요? 좋은 예시로는 VRChat이 있습니다. 이곳에서는 사용자 지정 후처리 효과를 만들 수는 없지만, 여전히 장면 내에서 셰이더를 만들 수는 있습니다.
이를 위해서는 카메라 깊이 생성 활성화(camera depth generation enabled)가 필수적입니다. 이는 디퍼드 렌더링(deferred rendering)의 경우 자동으로 작동하지만, 기본적으로 포워드 렌더링(forward rendering)에서는 그렇지 않습니다. C# 스크립팅을 사용하여 이를 활성화할 수 있습니다. 하지만 메인 카메라 속성에 접근할 수 없는 경우에도 이를 활성화하는 다른 방법들이 있습니다.
카메라 깊이 텍스처 트릭 1 (Camera Depth Texture Trick 1): 후처리 스택(post-processing stack)을 사용할 수 있다면, 주변 폐색(ambient occlusion)을 활성화하여 카메라 깊이 텍스처 생성 플래그를 활성화할 수 있습니다. (오버헤드를 낮게 유지하려면 사용하지 않을 경우 AO 품질 설정을 가장 낮은 수준으로 설정하십시오. 또한 강도 값(intensity value)이 0보다 커야 효과가 작동합니다)
카메라 깊이 텍스처 트릭 2: orels1의 배려로, 그림자를 드리우는 방향성 라이트를 생성합니다. 이 방향성 라이트의 컬링 레이어(culling layer)를 특정 레이어에 맞추도록 설정하면 Unity가 카메라 깊이 텍스처 생성을 활성화하게 됩니다.
자세히 설명될 예정이지만, 이는 Oculus/Meta Quest 2에서 테스트되었고 작동합니다.
장점/단점
장점
- 간단하고 성능이 우수하며, 런타임에 3D 텍스처가 샘플링되고 장면 깊이 버퍼(scene depth buffer)를 따라 레이마칭(raymarched)됩니다. 추가적인 단계가 필요하지 않습니다 (라이트, 그림자맵 등을 샘플링해야 하는 다른 볼륨 조명 솔루션과 비교했을 때).
- 볼륨의 외관은 순수하게 오프라인으로 생성됩니다. 오프라인이라는 특성상 간접 조명(indirect lighting) 같은 것을 샘플링하는 데 더 많은 계산과 처리를 적용할 수 있어 안개(fog)의 외관을 완전히 변화시킬 수 있습니다.
단점
-
고해상도 3D 텍스처는 VRAM과 디스크 공간을 쉽게 차지하므로, 크기를 작게 유지하려면 해상도가 낮아야 합니다. 이는 선명한 그림자에 좋지 않습니다.
-
이 구현은 완전히 베이크(baked)되므로, 어떤 런타임 라이트도 안개의 외관을 변경하거나 영향을 미치지 못합니다.
-
만약 라이트 프로브(light probes)에서만 샘플링하는 경우, 볼륨의 선명도/정밀도/해상도는 라이트 프로브 그리드가 얼마나 조밀하게 채워져 있는지에 따라 달라집니다. 매우 희소하면 충분한 샘플링할 라이트 프로브가 없기 때문에 볼륨이 매우 낮은 해상도로 보일 수 있습니다 (높은 해상도의 3D 텍스처를 사용하더라도) (참고: 이를 해결하기 위해 대신 복셀 트레이서(voxel tracer)를 사용할 수 있습니다).
-
Post Processing V1/V2 구현의 경우 여러 볼륨을 중첩할 수 없습니다. (이는 froxel을 활용하는 새로운 구현으로 미래에 해결될 예정입니다)
-
Post Processing V1/V2 및 Scene Based 구현의 경우, 낮은 레이마칭 샘플(또는 높은 레이마칭 거리)은 매우 노이즈가 많은 결과를 초래할 수 있습니다.
-
Light Probe Proxy Volume에서 조명을 샘플링하는 장면 기반(scene-based) 변형의 경우, 런타임에 볼륨을 효율적으로 필터링할 수 있는 사전 처리 과정이 없습니다. 따라서 LPPV가 낮은 해상도일 경우 결과물이 매우 블록처럼/거칠게 보일 수 있습니다.
향후 계획/아이디어
- 후처리(POST PROCESSING): 인터리브드 렌더링(interleaved rendering).
- 후처리(POST PROCESSING): 애니메이션 노이즈와 결합된 시간적 필터링(temporal filtering)을 통해 여러 프레임에 걸쳐 샘플을 누적합니다.
- 후처리(POST PROCESSING): 장면 내의 여러 볼륨을 교차하는 froxel 솔루션. 이를 통해 각 볼륨마다 레이마칭(raymarch)하는 대신 한 번만 레이마칭할 수 있습니다. 이는 또한 후처리 솔루션을 위해 효율적인 방식으로 장면에 여러 볼륨을 가질 수 있는 기능을 허용합니다.
- 에디터(EDITOR): 저밀도 값에서 복셀 미리보기(Previewing Voxels)가 매우 느립니다. 다양한 복셀을 미리 볼 다른 방법을 고안해야 합니다.
- 에디터(EDITOR): 장면 계층 구조(scene hierarchy)에 볼륨을 생성하는 컨텍스트 메뉴 항목을 추가합니다.
기여자(Credits)
- orels1: VRC 지원 개선.
- s-ilent: 이 리포의 포크(fork)에서 bluenoise를 활용하여 노이즈 개선.
- Christoph Peters: 무료 blue noise 텍스처.
- pema99: 추가 최적화 여지를 제공하는 Quad Intrinsics 라이브러리.
- Voxel Tracer: 나의 Voxel Tracer.
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub GameDev의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기