WinCNT

Volume의 Bloom에서 추가 속성(Addtional Properties)인 Downscale, Max Iterations를 표시하고 최적화하기! 본문

Unity/Unity 관련

Volume의 Bloom에서 추가 속성(Addtional Properties)인 Downscale, Max Iterations를 표시하고 최적화하기!

WinCNT_SSS 2024. 4. 1. 10:30

서론

이번에는 Volume의 Bloom의 어떠한 속성들을 찾지 못 해서 삽질했던 경험에 대해서 써보려고 한다

Bloom하면 URP에 대한 내용 같지만, 이번 내용은 사실 Bloom 자체와는 아무런 연관이 없기에 Unity 관련 내용에 정리하고자 한다


그래도 배경 설명을 위해 Bloom에 대해 간단히 정리

유니티 URP에서 Bloom(다른 엔진들도 비슷하겠지만)은 다음과 같은 구조로 구현된다

  • Bloom할 부분 필터링(하면서 1/2 해상도로 Downscale)
  • 위의 결과를 1/2 해상도로 Blur를 하면서 Downsampling
    • 특정 횟수 반복
  • 위의 결과를 2배 해상도로 Upsampling
    • 특정 횟수 반복(Downsampling 때와 같은 횟수)
    • 결과적으로 Downsampling 하기 전, 즉 필터링 후의 해상도가 됨
  • 위의 작업을 원래의 해상도로 Upscale하고 원본과 합침

실제로는 Blur의 종류(가우시안 블러 등등)에 대해서나, 가로와 세로를 나눠서 Blur한다거나 하는 등등의 내용들도 있지만 딱히 이번 내용과는 상관 없기에…

 

아무튼 유니티의 Frame Debugger에서 실제로 Bloom이 어떻게 처리되는지 볼 수 있다


이번 목적은 반복되는 부분을 줄이는 것!

Bloom에서 Downsampling과 Upsampling를 반복하는 것은 그렇게 하는 것이 Bloom의 퀄리티가 높기 때문이다

물론 다른 이유들도 있을 수 있다

 

하지만 성능을 위해서는 퀄리티를 포기해야 할 때도 있는 법…

VR은 가뜩이나 성능이 부족하므로 이번 프로젝트의 Bloom도 반복되는 부분을 줄이고자 했다

 

하지만 실제로 Volume의 Bloom을 살펴보니 관련 항목이 없는 것 아닌가!!


공식 문서에서도 설명하고 있는 속성은 맞다

혹시 Unity에는 그런 항목 자체가 없는 게 아닐까…?

라는 의심은 단 한 번도 한 적이 없다

만약 필자가 자체 엔진을 만든다고 했을 때, 이런 건 있어야지~라고 생각한 기능들은 당연히도 대부분 이미 유니티에 있었기 때문에 이번에도 믿었다

 

실제로 공식 문서를 살펴보니 반복 횟수를 조정하는 Max Iterations라는 프로퍼티가 있었다!!!

Bloom | Universal RP | 14.0.10

 

Bloom | Universal RP | 14.0.10

Bloom Scene with Bloom effect turned off. Scene with Bloom effect turned on. The Bloom effect creates fringes of light extending from the borders of bright areas in an image. This creates the illusion of extremely bright light overwhelming the Camera. The

docs.unity3d.com


왜 안 보였던 것일까? 우선 해결책부터…

원인은 단순했는데 Max Iterations가 Addtional Properties였기 때문에 Addtional Properties가 보이도록 설정하지 않으면 안 보였던 것이다

 

따라서 해결책은 매우 간단했다

Bloom의 오른쪽에 있는 옵션(3개의 점)을 누르고 Show Addtional Properties에 체크해주면 된다

 

매번 하는 것이 싫으면 밑의 Show All Addtional Properties…을 눌러서 나오는 아래의 윈도우에서 Visibility 설정을 변경하면 된다


해결책에 이르기까지의 삽질

처음에는 검색해도 잘 나오지 않아서 Bloom의 코드를 확인했었다

그런데 떡하니 있는 것 아니겠는가!

 

Packages/com.unity.render-pipelines.universal/Runtime/Overrides/Bloom.cs

/// <summary>
/// Controls whether to use bicubic sampling instead of bilinear sampling for the upsampling passes.
/// This is slightly more expensive but helps getting smoother visuals.
/// </summary>
[Tooltip("Use bicubic sampling instead of bilinear sampling for the upsampling passes. This is slightly more expensive but helps getting smoother visuals.")]
public BoolParameter highQualityFiltering = new BoolParameter(false);

/// <summary>
/// Controls the starting resolution that this effect begins processing.
/// </summary>
[Tooltip("The starting resolution that this effect begins processing."), AdditionalProperty]
public DownscaleParameter downscale = new DownscaleParameter(BloomDownscaleMode.Half);

/// <summary>
/// Controls the maximum number of iterations in the effect processing sequence.
/// </summary>
[Tooltip("The maximum number of iterations in the effect processing sequence."), AdditionalProperty]
public ClampedIntParameter maxIterations = new ClampedIntParameter(6, 2, 8);

 

인스펙터에 표시되는 프로퍼티(위에서는 highQualityFiltering)와 표시되지 않는 프로퍼티(위에서는 downscale와 maxIterations)의 차이점을 살펴보니 AdditionalProperty란 Attribute가 있냐 없냐의 차이였다

 

실제로 downscale와 maxIterations에서 AdditionalProperty를 지우니 (…) 인스펙터에 표시되었다

그 뒤로 검색 키워드를 AdditionalProperty로 좁히니 상술했던 해결책을 발견할 수 있었다


결과

아무튼 Addtional Properties의 설정을 잘 해주면 문제 없이 표시된다

 

이건 Max Iterations를 3으로 조정(디폴트는 6)해서 Bloom 처리를 줄인 결과이다

Draw Procedural이 16에서 7로 

 

Max Iterations가 3일 때, Draw Procedural가 7이 된 이유는 다음으로 생각된다

  • 초기 Filtering에서 Iterations : 1
  • Downsampling(+가로 Blur)와 세로 Blur에서 Iterations : 2 * 2
  • Upsampling에서 Iterations : 2

즉, Bloom의 Draw Procedural 횟수는 1 + 3 * (Max Iterations - 1)이라 할 수 있으며, Max Iterations가 6일 때 16인 것도 이것으로 설명할 수 있다

물론 스크린의 해상도가 너무 작거나 크면 Max Iterations를 변경해도 Draw Procedural 횟수에는 변화가 없을 수 있으니 주의가 필요하다


사족) Downscale 프로퍼티에 대해서

Show Addtional Properties를 누르면 Downscale라는 프로퍼티도 표시된다

공식 문서에 따르면 Downscale은 Bloom 시의 초기 해상도를 설정하는 프로퍼티로 Half와 Quarter가 선택이 가능하다(디폴트는 Half)

Property Description
Downscale Set the initial resolution scale for the effect.
The lower this value is, the fewer system resources the initial blur effect consumes.

 

예를 들어 Downscale을 Half로 설정한 경우 Filtering 할 때의 해상도는 1/2이 되지만 Quarter로 설정한 경우에는 해상도가 1/4이 된다!!

Half의 경우(좌) /  Quarter의 경우(우)

 

Iteration에는 영향이 없기 때문에, 여전히 Downsampling할 때는 해상도를 1/2로 하고 Upsampling에서는 2로 하며, Draw Procedural 횟수도 그대로이다

 

하지만 주의해야 할 점은 Upsampling은 Filtering 할 때의 해상도까지 반복하기 때문에…

Quarter인 경우에는 Upsampling이 끝났을 때의 해상도가 1/4이 된다

최종적으로는 이걸 원래의 해상도로 되돌리면서 원본과 합치기 때문에 Half에 비해서 Bloom에 앨리어싱이 발생하기 쉬워진다

 

확실히 Quarter인 경우가 코스트를 아낄 수 있겠지만, 그에 비해 퀄리티가 너무 떨어지는 것 같아서 개인적으로는 추천하지 않는다


마무리

해결책을 알고나니 약간 허무해진 작업이었다

그래도 이제는 절대 안 까먹겠지!


참고 사이트

딱히 없는 것 같다