Unity

Unity RenderBufferLoadAction & StoreAction 옵션 설명

CatDarkGame 2025. 6. 11. 00:29
반응형

개요

Unity 엔진에서 ScriptableRenderPass 등, 커맨드 버퍼에 RenderTarget 설정 할때 RenderBufferLoadAction & StoreAction 옵션에 대한 설명입니다. 해당 옵션은 SetRenderTarget으로 설정한 렌더버퍼에 대한 데이터를 메모리에 Load 옵션과 Store(방출) 옵션을 설정하는 것입니다.

옵션에 따라 메모리 대역폭에 영향을 주기 때문에 구현하는 RenderPass 목적에 따라 알맞게 설정하면 최적화에 도움됩니다.

 

 

옵션 설명

RenderBufferLoadAction 옵션

  1. LoadAction.Load
    • 기능 : GPU가 렌더링 할 때 기존 프레임 버퍼 내용을 로드합니다.
    • 용도 : Blend 처리와 같이 현재 버퍼 내용과 이후 드로우콜 결과물이 합쳐지는 용도로 사용합니다.
    • 성능 고려 사항 : 메모리에서 전체 버퍼를 읽어야 하기 때문에 대역폭 비용이 발생합니다.
  2. LoadAction.DontCare
    • 기능 : GPU가 렌더링 할 때 기존 프레임 버퍼 내용을 로드하지 않습니다.
    • 용도 : 프레임 버퍼 내용을 덮어 쓸 때 사용합니다. (Blend는 안되지만 샘플링은 가능합니다.)
    • 성능 고려 사항 : 가장 최적화된 옵션이며, 메모리 대역폭 절약합니다.
  3. LoadAction.Clear
    • 기능 : 프레임 버퍼 내용을 지정된 색상으로 초기화합니다, 깊이 버퍼 경우에는 흰색(1.0)으로 초기화됩니다.
    • 용도 : 프레임 버퍼를 지우고 새로 그릴 때 사용합니다. 그런데 cmd.ClearRenderTarget 메소드로 동일한 처리 가능해서 왜 있는 옵션인지 모르겠습니다.
    • 성능 고려 사항 : 메뉴얼 상에는 Clear 이후 LoadAction.Load로 동작한다고 합니다.

 

RenderBufferStoreAction 옵션

  1. StoreAction.Store
    • 기능 : 렌더링 결과를 메모리에 저장합니다.
    • 용도 : 이 렌더 타겟을 다시 사용하거나 화면에 표시할 때 사용합니다. (화면에 그려야 하거나 다음 패스에서 샘플링 필요하면 사용)
    • 성능 고려 사항 : 전체 렌더 타겟을 메모리에 쓰므로 대역폭 비용이 발생합니다.
  2. StoreAction.DontCare
    • 기능 : 렌더링 결과를 메모리에 저장하지 않습니다.
    • 용도 : 일회성 계산이나 중간 결과물로 더 이상 필요하지 않은 렌더 타겟에 사용합니다.
    • 성능 고려 사항 : 메모리 쓰기 작업을 수행하지 않으므로 메모리 대역폭을 절약합니다.
  3. StoreAction.Resolve
    • 기능 : 멀티샘플 버퍼의 여러 샘플을 통합하여 단일 샘플 텍스처로 변환합니다, 원본 멀티 샘플 버퍼 정보는 유지하지 않습니다.
    • 용도 : MSAA 렌더링 후 결과를 샘플링해야 할 때 필요합니다.
    • 성능 고려 사항 : 원본 멀티샘플 데이터는 버리므로 메모리 사용량이 줄어듭니다.
  4. StoreAction.StoreAndResolve
    • 기능 : 멀티샘플 버퍼를 원본 형태로 저장하고, 동시에 통합된 단일 샘플 버전도 생성합니다.
    • 용도 : 멀티샘플 데이터를 계속 유지하면서 동시에 후처리를 위한 단일 샘플 버전이 필요할 때 사용합니다.
    • 성능 고려 사항 : 두 형태의 데이터를 모두 저장하므로 메모리 사용량이 두 배로 증가할 수 있습니다.

 

 

만약 올바르지 않게 설정하면 발생하는 이슈

이슈 재현 환경은 LoadAction을 DontCare로 설정하고 Blend 셰이더 드로우콜 호출하게 세팅했습니다.

Blend 셰이더가 동작하기 위해서 RenderTarget의 프레임 버퍼 픽셀을 정보가 필요하기 때문에 LoadAction을 Load로 세팅하는 것이 올바른 것 입니다.

 

Unity 2022 & 6000.032 버전 기준으로 에디터에서는 문제 없이 동작합니다.

문제는 디바이스 빌드에서 발생하며 안드로이드 기준, GPU 칩셋 종류와 Graphics API에 따라 문제 현상이 다르게 발생합니다.

  • 유니티 에디터

 

  • Adreno 750(갤럭시z플립6) / Vulkan

 

  • Adreno 750(갤럭시z플립6) / OpenGLES

 

  • Mali-G76(갤럭시s10e) / Vulkan

 

  • Mali-G76(갤럭시s10e) / OpenGLES

 

 

결과와 같이 SetRenderTarget 메소드의 RenderBufferLoad & Store 세팅을 올바르지 않게 하면 디바이스 환경에 따라 문제 발생하니 RenderPass 구현 용도에 알맞게 세팅 필요합니다.

  Vulkan OpenGLES
Adreno 750(갤럭시z플립6) 정상 비정상
Mali-G76(갤럭시s10e) 비정상 정상

 

이전 문제되는 환경 세팅에서 RenderBufferLoad 옵션을 올바르게 세팅하는 경우 정상 동작합니다.

 

 

 

결론

앞선 설명을 반복해서 RenderBufferLoad & Store 옵션은 용도에 알맞게 세팅해야 합니다.

올바르지 않은 세팅에서 정상 동작되는 상황은 자세한 원인은 Xcode GPU FrameCapture와 같은 GPU 프로파일링 도구를 통해 확인해봐야 겠지만, API 단계에서 자동으로 처리하는 상황으로 보입니다. 

 

반응형