상세 컨텐츠

본문 제목

안드로이드 기기에서 그래픽이 깨지는 경우 (feat Mobile Shader)

UNITY TroubleShooting

by 오픈플레이 2019. 6. 22. 15:14

본문

문제가 발견된 경우는 유니티 2018.3.14 환경에서 안드로이드 빌드를 했을 때 였습니다.

특별한 경우가 아닌경우, 모바일 디퓨즈 쉐이더Mobile Diffuse Shader를 사용함으로써 기기의 부하를 줄이는 것을 목표로 둡니다. 표현이 간단한 3D 오브젝트에 특히나 효과적이죠.

그런데, 이전버전(5.6 또는 2017)의 유니티에서 빌드 했을 때 안드로이드 기기에서 잘 작동하는 것을 보았으나, 2018.3에서 빌드 했을 경우, 심각한 그래픽 깨짐과 더해 버벅임이 더해지더니 결국 크래쉬가 발생, 해당 앱이 강제종료되는 문제가 발생했습니다.


다행히 새로운 프로젝트를 진행하는 중 안드로이드 기기에서 테스트를 하면서 문제점을 발견했는데요, 바로 기본 모바일 디퓨즈 쉐이더 (3.수정사항 참조)의 문제였습니다.

발견된 기기는 테스트 폰인 홍미노트 3삼성 갤럭시 S4 입니다.

두 제품 모두 PowerVR 그래픽 프로세서를 사용하고 있는데, 호환성 측면에서 신경써줘야 하는 면이 있어요. 참고로, 유니티 2018.3 버전중 2018.3.14 이하에서는 UI 이미지 마스크 Mask 기능이 작동하지 않는 문제가 있었다가, 2018.3.14버전에서 해결되었습니다.

 


1. 다른 쉐이더를 사용하기

말 그대로 모바일 디퓨즈 쉐이더 말고 다른 쉐이더를 사용하여 테스트를 해봐야 합니다. 예를 들어, Vertex Lit 말이죠.

이렇게 해도 PowerVR 그래픽 칩을 사용하는 기기에서 문제가 생긴다면, 유니티의 다른버전 사용을 고려해봐야 할 것 같습니다.

 

2. 커스텀 쉐이더 생성 및 적용

저의 경우는 커스텀 쉐이더를 만들어서 사용했습니다.

Standard Surface Shader의 선택이 무난합니다.

스탠다드 서피스 쉐이더는 텍스쳐 색상 / 텍스쳐2D / Glossiness / Metalic 이들 4가지 항목이 기본으로 되어있습니다.

저의 경우로는 Glossiness 와 Metalic이 필요없으므로, 스크립트에서 해당항목을 주석처리 하여 사용했습니다.

모바일 기기에서 실행 해 보니, 그래픽 깨짐없이, 그리고 크래쉬 없이 작동이 잘 되는 것을 볼 수 있었습니다.


 

3. 수정사항 (19.07.06)

개발중인 프로젝트를 실 기기에 빌드를 해보니 같은 증상이 발생되었습니다. 새로운 커스텀 쉐이더를 적용했음에도 문제가 발생했는데요, GPU instancing 기능을 해제하니 문제가 사라진 것을 볼 수 있었습니다.

문제가 되는 쉐이더의 GPU Instancing을 해제

https://docs.unity3d.com/kr/2017.4/Manual/GPUInstancing.html

 

GPU 인스턴싱 - Unity 매뉴얼

GPU 인스턴싱을 사용하면 적은 수의 드로우 콜을 사용하여 동일한 메시의 여러 복제본을 한 번에 그리거나 렌더링할 수 있습니다. 씬에서 반복적으로 나타나는 건물, 나무, 풀 등의 오브젝트를 그릴 때 유용합니다.

docs.unity3d.com

해당 자료를 다시한번 읽어보니, Vulkan을 지원하는 안드로이드 기기 및 GPU에서만 사용할 수 있네요.

즉, 불칸을 지원하지 않는 구형 GPU에서는 큰 문제가 발생한다는 얘깁니다.

수백개의 같은 오브젝트가 등장하지 않는 이상 GPU Instancing을 사용하지 않아도 문제는 없습니다. 이전에 수십만 폴리곤이 있는 씬을 싱글CPU + GPU에서 구현한적이 있으니까요. 단지 제가 최적화 성애자라... ㅇㅅㅇ...

 

댓글 영역