데브허브 | DEVHUB | [Unite Seoul 2025] Unity 6 렌더 그래프 시스템을 활용한 SSAO 커스텀 사례와 URP Custom Shadow Solution 개발[Unite Seoul 2025] Unity 6 렌더 그래프 시스템을 활용한 SSAO 커스텀 사례와 URP Custom Shadow Solution 개발
- Unity 내장 SSAO는 모바일에서 높은 블러 비용, 다수의 렌더 텍스처, 3D-2D 공간 변환 등으로 성능 및 메모리 부담이 컸습니다. 📱
- SSAO 계산 알고리즘을 3D 구면 좌표계 대신 2D UV 공간에서 직접 샘플링하도록 경량화하여 공간 변환 연산을 제거하고 계산 비용을 절반으로 줄였습니다. 💡
- Unity 6의 렌더 그래프 시스템은 렌더 타겟 재사용, 로드/스토어 액션 자동 최적화 등을 통해 메모리 사용량과 GPU 오버헤드를 자동으로 줄여줍니다. ♻️
- 렌더 그래프의 레스터 패스 구조는 렌더 타겟의 수명을 관리하여 코드에서 여러 개를 생성해도 실제 메모리에는 필요한 만큼만 올리는 효율적인 자원 관리를 가능하게 합니다. 🧠
- 네이티브 렌더 패스 병합과 프레임 버퍼 패치(FBF)를 활용하여 이전 패스 결과를 디바이스 메모리 백업 없이 타일 메모리에서 직접 읽어와 대역폭 및 메모리 비용을 절감하고 샘플링 비용을 거의 없앴습니다. 🚀
- FBF는 임의의 UV 샘플링이 불가능하며, 네이티브 렌더 패스 병합 시에만 이득이 있고, 에디터 환경에서는 동작하지 않을 수 있어 실제 기기 확인이 필수입니다. ⚠️
- FBF를 통해 디바이스 메모리에 접근하지 않는 렌더 타겟은 메모리 리스 모드로 자동 설정되어 메모리 공간을 차지하지 않게 됩니다. 👻
- Unity 6의 히스토리 매니저를 활용하여 이전 프레임 데이터를 쉽게 얻어 템포럴 블러, 프레임 분산 샘플링, SSAO 텍스처 캐싱 등의 최적화를 구현했습니다. ⏳
- 템포럴 블러는 고품질 바이레터럴 블러와 유사한 룩을 절반 비용으로 제공하며, 프레임 분산 샘플링은 성능 저하 없이 퀄리티를 향상시킵니다. ✨
- 카메라가 정지하면 SSAO 계산을 멈추고 이전 프레임 결과를 재사용하는 캐싱 기법으로 로비나 탑뷰 등에서 GPU 비용을 크게 절감하고 발열 시간을 확보했습니다. 🧊
- 최종적으로 SSAO 메모리 비용을 1.5~2MB 수준으로 줄였으며, 향후 컴퓨트 쉐이더로 전환하여 병렬 처리를 계획하고 있습니다. 📉
- URP의 기존 CSM(Cascaded Shadow Maps)은 근접 오브젝트의 텍셀 밀도가 낮고 셀프 섀도잉 품질이 떨어지는 문제가 있어 커스텀 섀도우 개발의 필요성이 제기되었습니다. 🌳
- 카메라 뷰와 무관하게 오브젝트 바운즈 기반으로 그림자를 렌더링하는 퍼 오브젝트 섀도우(Per-Object Shadow)를 도입하여 캐릭터의 캐스트 섀도우 및 셀프 섀도잉 품질을 향상시켰습니다. 👤
- 스킨드 메시 렌더러의
Update When Offscreen 옵션과 텍스처 아틀라스(동적 해상도, MaxRects 알고리즘, Job 시스템)를 활용하여 여러 캐릭터의 그림자를 효율적으로 관리했습니다. 🖼️
- 퍼 오브젝트 섀도우를 CSM과 통합하기 위해 스크린 스페이스 섀도우 맵(SSSM) 방식을 사용, CSM 결과 위에 퍼 오브젝트 섀도우를 렌더링하여 오버드로우를 줄였습니다. 🗺️
- 오버드로우 해결을 위해 스텐실 마스크를 이용한 메시 내부 판정 및 인접 캐릭터 바운즈 병합(Job 시스템 활용) 기법을 적용했습니다. 🧩
- 소프트 섀도우(페넘브라) 및 컬러드 페넘브라 표현을 위해 다이나믹 브랜칭을 활용, 그림자 경계 부분에서만 소프트 섀도우 연산을 수행하여 모바일 환경에서도 부드러운 그림자를 구현했습니다. 🌈
- 소프트 섀도우 경계 판정을 위해 다운 샘플링 및 블러 처리를 적용하여 노이즈를 제거하고 효율적인 연산을 가능하게 했습니다. 🌫️
- 최종 커스텀 섀도우 솔루션은 URP CSM 로우 퀄리티 PCF와 유사하거나 더 나은 GPU 성능을 보였으며, 이는 버텍스/프래그먼트 쉐이더 병렬 처리 및 포워드 패스 최적화 덕분입니다. ⚡