Unity Universal RP용 Raymarched 포그 볼륨 구현체
요약
본 구현체는 Unity의 Universal Render Pipeline(URP)을 위해 단일 반사(single-bounce) 방식으로 작동하는 부피형 안개(volumetric fog)를 제공합니다. 깊이 인식 업샘플링 및 리프로젝션을 활용하여 다양한 환경에서 사실적인 안개 효과를 구현할 수 있습니다.
핵심 포인트
- Unity URP용 Raymarched Volumetric Fog 구현체입니다.
- 깊이 인식을 사용한 하프/쿼터 해상도 렌더링을 지원합니다.
- Cube, Capsule 등 4가지 기본 도형에 적용 가능하며 비균일 변환을 지원합니다.
- 최대 32개의 라이트와 실시간 그림자 및 쿠키를 물리 기반으로 구현했습니다.
Unity의 Universal RP를 위한 Raymarched Fog Volumes
이 저장소는 Unity의 Universal Render Pipeline을 위한 단일 반사(single-bounce) raymarched 부피형 안개(volumetric fog) 구현체입니다.
| Scenes | Outdoors Light Shafts | URP Samples- Japanese Garden | Nighttime streetlights |
|---|---|---|---|
| Fog | ![]() | ![]() | ![]() |
| No Fog | ![]() | ![]() | ![]() |
설치 (Installation)
- 패키지 관리자(package manager)를 열고 왼쪽 상단 드롭다운에서 'Git URL로 패키지 추가(Add package from Git URL)' 옵션을 선택합니다.<br>Git Input URL<br>

- 다음 링크를 사용하여 이 저장소의 git URL을 프롬프트에 추가합니다: https://github.com/sinnwrig/URP-Fog-Volumes.git.<br>Outdoors Fog<br>

기능 (Features)
- 깊이 인식 업샘플링(depth-aware upsampling)을 사용한 하프 및 쿼터 해상도 렌더링 (시간적 렌더링과 비호환).<br>* 리프로젝션(reprojection)을 이용한 시간적 렌더링(Temporal Rendering) (준완성).<br>* 애니메이션 스크롤 3D 텍스처 노이즈 지원<br>* 균일하지 않은 크기 조정 및 회전(non-uniform scale and rotation)을 지원하는 4가지 기본 도형:<br> * Cube<br> * Capsule<br> * Sphere<br> * Cylinder<br>* 최대 32개의 라이트를 볼륨당 지원하며, 모든 실시간 라이트, 그림자 및 쿠키(cookies)를 지원합니다.<br> * 조명은 완전히 물리 기반(physically-based)이 아니며, 대신 더 세밀한 조정을 위한 예술적 제어 기능을 노출합니다.<br> * 광원 감쇠(Light attenuation)는 단일 반사만이며, 안개는 자체 그림자(self-shadow)를 만들지 않습니다. 다중 반사 라이트마칭(Multiple-bounce lightmarching)은 곧 추가될 예정입니다.<br>* Unity 2023.1+의 APV GI 지원<br>* Gas Station, Forest, 그리고 Office Building 장면 샘플. 이들은 패키지 관리자를 통해 가져올 수 있습니다.
사용법 (Usage)
- 렌더러에 Fog Volume Render Feature를 추가합니다.<br>* GameObject/Volumes/ 아래 옵션을 사용하거나, 어떤 객체에든 FogVolume 컴포넌트를 추가하여 장면에 새로운 Fog Volume을 생성합니다.<br>* 새 프로필(profile)을 생성하거나 할당합니다.<br>* 원하는 모습이 나올 때까지 객체의 크기 및 프로필 설정을 조정합니다.
제한 사항 (Limitations)
해결 불가 (Unresolvable)
- DirectX 9(2009~2011년 이전 데스크톱 GPU) 또는 DirectX 11 9.x(Windows Phone 및 Microsoft Surface RT 전용 DirectX 버전)를 지원하지 않습니다. 이 셰이더 모델은 동적 루프와 호환되지 않습니다.
- Temporal Reprojection은 Scene View에서 비활성화되며, Play Mode에서만 작동합니다. Unity는 에디터 뷰에 일관된 Motion Vector를 생성하지 못하는 것 같으며, 심각한 왜곡/블러링을 유발합니다.
- Fog가 Skybox나 빈 공간을 향할 때는 Temporal Reprojection이 해당 부분을 재투영할 수 없습니다. 추적하고 움직임을 계산할 식별 가능한 특징(discernible features)이 없는 곳에서는 Motion Vector를 생성할 수 없습니다.
- 현재 볼륨당 최대 32개의 라이트라는 하드캡(hard cap)이 있습니다. 이 제한은 VolumetricFog.shader와 FogVolume.cs에서 최대 라이트 상수(maximum light constants)를 수정하여 변경할 수 있습니다.
개발 중 (Under Development)
- 볼륨을 통과하는 물리 기반 광 산란(physically based light scattering)을 사용하지 않으며, 조명은 단일 반사(single-bounce)만 처리합니다. 이는 방향성 라이트의 경우 밀도와 관계없이 볼륨이 균일하게 조명된다는 것을 의미합니다. Lightmarching 기능 추가가 계획되어 있습니다.
- Orthographic 카메라에서는 작동하지 않습니다. 이 부분은 수정될 예정입니다.
- 현재 Baked lighting 및 light probes는 작동하지 않습니다. 이 부분 역시 수정될 예정입니다.
투명도 처리 (Transparency Handling)
투명 객체가 깊이 텍스처(depth texture)에 렌더링되는 방식 때문에, 투명도는 Fog Volumes와 기본적으로 작동하지 않으며 추가적인 렌더 기능 설정이 필요합니다. 자세한 내용은 Forum Post를 참고해야 하지만, 간단한 튜토리얼을 제공하겠습니다:
- 안개(fog)의 영향을 받게 하고 싶은 모든 투명 렌더러를 별도의 레이어('TransparentDepth')에 배치합니다.
- 방금 생성한 이 레이어를 활성화된 URP 렌더러의 Filtering 섹션에 있는 Transparent Layer Mask 필드에서 제거합니다. 이 객체들은 대신 렌더 기능(render feature)을 사용하여 렌더링됩니다.
- Render Objects 렌더 기능을 Fog Volume 렌더 기능보다 먼저 렌더러에 추가합니다.
- Render Objects의 Event 필드를 _AfterRenderingTransparents_로 설정합니다.
- Filters 아래에서 큐(queue)를 _Transparent_로, 레이어 마스크(layer mask)를 사용자 정의 투명 깊이 레이어로 설정합니다.
- Overrides 아래에서 _Depth_를 재정의하고 _Write Depth_를 활성화하며 _Depth Test_를 _Less Equal_로 설정합니다.
잠재적 문제 (Potential Issues)
현재 상태의 에셋에는 눈에 띄거나 지나치게 명백한 문제는 없다고 확신합니다. 하지만 이 에셋은 충분한 테스트를 거치지 않았으며, 이 패키지에 버그가 있거나 일부 플랫폼에서 작동하지 않을 가능성이 있습니다.<br><br>
이 에셋은 다음 환경에서 테스트되었습니다:
- OpenGL 4.5.
- DirectX 11.
- DirectX 12.
- Vulkan.
- Unity 버전 2022.3.
- Windows.
- Linux.
이 에셋은 테스트되지 않았지만, 다음 환경에서 작동할 수 있습니다:
- Metal.
- VR 또는 AR 플랫폼.
- 2022.3 미만의 Unity 버전.
- macOS.
- PlayStation 기기.
- Xbox 기기.
- Nintendo 기기.
- iOS.
- visionOS.
- Android.
- WebGL.
- UWP.
- tvOS.
예시
안개 유무에 따른 일본 숲


안개 유무에 따른 오아시스


안개 유무에 따른 건물


안개 유무에 따른 일본 정원


안개 유무에 따른 주유소


안개 효과가 적용된 데모 터미널 건물

AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub GameDev의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기