본문으로 건너뛰기
CHOI HONGSU
1 min read

PostProcessing Bloom 최적화

 

Compute Shader 기반 Bloom을 Fragment Shader로 전환

  • 85% COSPostProcessing GPU time 절감 (8.37ms → 1.26ms)
  • 91% Bloom RT 메모리 절감 (16.6 MB → 1.4 MB)
  • -15.1 MB 전체 RenderTexture 감소 (95.0 MB → 79.9 MB)

Approach

Fragment Shader 전환

Chosen

Pros

  • Async 의존성 제거, 파이프라인 단순화, RT 포맷 자유도

Cons

  • 전면 교체 필요

Compute Shader 유지 + 버그 수정

Pros

  • 변경 최소

Cons

  • 프레임 지연 제거 시 Async 이점 소멸, 구조적 debt 잔류

Why Fragment Shader 전환: 선택: Fragment Shader 전환 버그 수정을 위해 프레임 지연을 제거하면 Compute의 성능 이점이 없어지는 상황. 이 기회에 History RT·GC 할당 등 누적 tech debt를 함께 정리.

Implementation

  1. 01

    Step 1 — Compute → Fragment 전환

    Bloom Pass 4(Prefilter), 5(DownSample), 6(UpSample)을 Fragment Shader 기반으로 교체.

    • RenderGraph: ComputePassRasterRenderPass 체인
    • Compatibility 모드: DispatchComputeDrawProcedural blit
    • enableRandomWrite = false
  2. 02

    Step 2 — History RT 제거 + 직결 전달

    COSBloomHistoryFrameRT 영구 RT 시스템 제거. Bloom 결과를 bloomResultTexture 필드로 직접 전달.
    → 4.15 MB 상시 점유 해제 + 1프레임 지연 제거.

  3. 03

    Step 3 — RT 포맷/해상도 경량화

  4. 04

    Step 4 — 샘플링 + Interpolator 경량화

  5. 05

    Step 5 — GC 할당 제거

    매 프레임 new 배열 → 고정 크기 필드 캐시:

  6. 06

    Step 6 — 버그 수정 (alpha, PreMiscPass)

    PreMiscPass: miscActivated == false일 때 완전 스킵.
    (Distortion/RadialBlur 미사용 확정 시 패스 제거 예정)

Validation

Tools: Memory Profiler / AGI · Build: Dev · Scene:  

DeviceGPUAPIRenderTextureCOSPostProcessing GPU time
BeforeAfterBeforeAfter
Galaxy S21 Mali-G78 Vulkan 1.1.0 95.0 MB79.9 MB (-15.1 MB)8.368 ms1.263 ms (−85%)

Unity Memory Profiler

Galaxy S21

BEFORE
Before
AFTER
After

Android GPU Inspector

Galaxy S21

BEFORE
AFTER
After

제목

RT 메모리

RTBeforeAfter비고
HistoryTexture × 210.0 MB0 MB시스템 제거
TempRTBloom05.0 MB1.0 MB포맷+해상도
TempRTBloom11.3 MB395.5 KB
TempRTBloom2342.9 KB52.9 KB
Bloom RT 합계16.6 MB1.4 MB (-91%)
전체 RenderTexture95.0 MB79.9 MB (-15.1 MB)

GPU 성능 (Android GPU Inspector)

항목BeforeAfter
COSPostProcessing GPU time8.368 ms1.263 ms (−85%)
베이스 해상도1/21/4
DownSample 샘플5/pixel4/pixel
UpSample 샘플8/pixel4/pixel
UpSample Interpolator18 floats8 floats

Before / After

Bloom 비교

 

BEFORE
AFTER

Tradeoffs & Future Work

Tradeoffs

  • 1/4 베이스 해상도는 근거리 큰 오브젝트에서 bloom 디테일 손실 가능. 필요 시 ReduceTextureDescSize 인자를 2 → 1로 변경해 1/2로 복구 가능.
  • Compute Shader 제거로 URP Inspector의 Compute Shader 슬롯 재설정 필요 (1회성).
  • COSBlurIsolatedFeature는 별도 커널 사용 - 이번 변경 영향 없음.

Conclusion

Compute Shader의 Async 버퍼 오버랩 구조가 다이얼로그·스크린 오버레이 환경에서
버퍼 충돌을 일으키는 근본 원인이었다. 버그 수정을 위해 프레임 지연을 제거하면
Compute의 성능 이점이 사라지는 상황에서, 이 기회에 History RT·GC 할당·Dead Code 등
누적된 구조적 부채를 Fragment Shader 전환으로 일괄 정리했다.

 

 

결과: COSPostProcessing GPU time −85% (8.37ms → 1.26ms),
Bloom RT 메모리 −91% (16.6 MB → 1.4 MB), 렌더링 버그 3건 해소.
시각 품질은 QA 검수 기준 허용 범위 내로 유지됐다.

 

 

버그 대응이 리팩토링의 트리거가 된 사례 — 근본 원인을 파고들면
국소 수정보다 더 큰 개선 여지가 열리는 경우가 많다.

Tags

Bloom
PostProcessing Bloom 최적화 · Cookie Run: Oven Smash · Choi Hongsu · Hongsu