일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- URP
- 개인 바이트
- C언어
- 메모리 누수
- Rim Light
- OculusMotionVectorPass
- 게임 수학
- Toon Shader
- Private Bytes
- Specular
- 작업 집합
- 프로그래밍 기초
- Three(Two) Tone Shading
- ColorGradingLutPass
- 벡터
- ASW(Application SpaceWarp)
- Windows Build
- Cartoon Rendering
- VR
- 가상 바이트
- Virtual Byte
- Cell Look
- URP로 변경
- Cell Shader
- working set
- 3d
- AppSW
- Today
- Total
WinCNT
파티클 시스템의 이펙트가 Dynamic Batching되지 않는 이슈 본문
발생한 이슈
파티클 시스템으로 만든 이펙트가 제대로 배칭되지 않는 이슈가 발생했다
이슈 상세
실제 씬에서 프레임 디버그를 확인해보면 다음과 같이 DrawTransparentObjects의 Set Pass Call이 93이나 되는 것을 확인할 수 있었다
확인을 위해서 문제의 오브젝트를 11개만 올린 씬에서는 다음과 같은 결과가 나왔다
오브젝트당 파티클 시스템이 2개 있으므로 각자 따로 그려진다면 22번 그려질 것이다
하지만 실제 결과는 16번으로 나왔다
프레임 디버그를 통해 드로잉된 순서를 확인해보면 카메라와의 거리와 머티리얼이 같은 오브젝트들(6그룹)만이 배칭이 적용된 것을 확인할 수 있었다
발생 원인
정확한 원인은 찾지 못 했다…어디까지나 추론이 섞인 원인이었다
그래도 해결했으니 문제 없지 않을까?
첫번째 원인은 역시 거리에 따른 문제로 보인다
유니티의 Batching 처리는 기본적으로 우선 거리에 따라 행해지는 것 같았다
Object proximity breaks dynamic batching?
두번째 원인은 Enable Mesh GPU Instancing의 체크 여부였다
파티클 시스템의 Renderer모듈에 있는 이 항목이 체크되어있으면 실제로 GPU 인스턴싱을 사용하지 않더라도 Dynamic Batching(그 외의 배칭 처리도 마찬가지일 것 같다)의 대상 외로 설정되는 것 같았다
해결법
우선은 이번엔 GPU Instancing가 필요 없었기 때문에 Enable Mesh GPU Instancing 체크를 해제했다
그리고 파티클의 머티리얼(셰이더)의 Render Prioty를 다른 이펙트와 겹치지 않게 조정하니 Dynamic Batching이 적용됐다!!
좀 더 조사해보니 머티리얼 말고 Particle System 컴포넌트의 Renderer모듈에 있는 Order in Layer를 조정해도 같은 결과를 얻을 수 있었다
물론 이는 말 그대로 렌더 큐의 순서를 바꾸는 것이기 때문에 다른 반투명 오브젝트와의 순서를 잘 생각해보고 바꿔야한다!
이 이펙트의 경우는 Blend Mode가 Additive이므로 렌더 큐를 바꿔도 문제가 없으리라 판단해서 변경했다
다만 페이드 아웃용 반투명 오브젝트를 고려하지 않아서, 페이드 아웃 중에도 이펙트가 그려진다는 버그가 발생해서 이쪽도 변경하게 되었다
마무리
상당히 필자를 괴롭혔으면서 지금도 더 좋은 해결책은 없을까 계속 생각나게 하는 이슈였다
파티클 시스템 외에도 SRP Batcher와 Static Batcher에도 비슷한 문제가 발생한다
아마도 비슷한 원인이지 않을까 하지만…유니티의 어느 부분을 보면 정확한 처리를 알 수 있는지 아직도 모르겠다
네이티브 소스코드 쪽이면 확인할 수도 없다ㅠㅠ
참고 자료
Object proximity breaks dynamic batching?
【Unity】不透明キューの描画順が手前からじゃない件 - LIGHT11
Unity - Scripting API: OpaqueSortMode
【Unity】Transparentシェーダー レンダリングTips (RenderQueue編) - すぎしーのXRと3DCG