WinCNT

URP에서 SpriteRenderer는 SRP Batcher가 작동하지 않았던 이유 조사 본문

Unity/URP or Shader 관련

URP에서 SpriteRenderer는 SRP Batcher가 작동하지 않았던 이유 조사

WinCNT_SSS 2023. 9. 28. 10:48

서론

SpriteRenderer인 오브젝트는 SRP Batcher가 작동하지 않기에 잠깐 조사했던 내용을 정리해봤다

이번에는 결론이 명확하기에 간략하게 정리하려고 한다


Objects have different MaterialPropertyBlocks set

프레임 디버그에서 확인해보면 SpriteRenderer인 오브젝트는 “Objects have different MaterialPropertyBlocks set”라는 문구가 뜨면서 SRP Batcher가 작동하지 않는 것을 볼 수 있다


MaterialPropertyBlock이란?

MaterialPropertyBlock은 머티리얼은 같지만 프로퍼티가 약간 다른 오브젝트(예를 들어 색상만 다른 경우 등)를 그릴 경우 사용하는 API이다

Unity - Scripting API: MaterialPropertyBlock

 

Unity - Scripting API: MaterialPropertyBlock

MaterialPropertyBlock is used by Graphics.RenderMesh and Renderer.SetPropertyBlock. Use it in situations where you want to draw multiple objects with the same material, but slightly different properties. For example, if you want to slightly change the colo

docs.unity3d.com

그리고 공식 문서에 매우 명확하게 SRP Batcher하고 호환되지 않는다고 적혀있다


SpriteRenderer와 MaterialPropertyBlock

그리고 매우 아쉽게도 SpriteRenderer 컴포넌트는 자체적으로 MaterialPropertyBlock를 사용하는 것으로 추측된다

UnityCsReference/Runtime/2D/Common/ScriptBindings/SpriteRenderer.bindings.cs at master · Unity-Technologies/UnityCsReference

또한 SpriteRenderer는 SRP Batcher를 지원하지 않는다는 답변도 있다

"SRP Batcher" in 2018.2

 

"SRP Batcher" in 2018.2

The release notes of 2018.2b1 mention this: Player: SRP Fast rendering codepath ("SRP Batcher"). Experimental, currently Directx11 and PS4 support....

forum.unity.com

향후에는 지원할 가능성이 있다고 하지만 2023.2 버전에서도 MaterialPropertyBlock랑 SRP Batcher은 호환되지 않는 것 같으니, 그 가능성은 매우 희박할 거라 보인다

(SpriteRenderer가 MaterialPropertyBlock를 사용하지 않는 가능성도 있지만 거기까진 모르겠다)


마무리

이번에는 그저 조사를 했을 뿐이라 딱히 해결책이 있진 않았다

굳이 떠오르는 해결책이라면 커스텀으로 스프라이트 렌더러를 구현하는 정도?

실제로 필요해지면 그 때 가서 고민해야지


참고 사이트

"SRP Batcher" in 2018.2

 

"SRP Batcher" in 2018.2

The release notes of 2018.2b1 mention this: Player: SRP Fast rendering codepath ("SRP Batcher"). Experimental, currently Directx11 and PS4 support....

forum.unity.com

Unity - Scripting API: MaterialPropertyBlock

 

Unity - Scripting API: MaterialPropertyBlock

MaterialPropertyBlock is used by Graphics.RenderMesh and Renderer.SetPropertyBlock. Use it in situations where you want to draw multiple objects with the same material, but slightly different properties. For example, if you want to slightly change the colo

docs.unity3d.com