[UNITY] Shader 전역 변수 _Time 모바일 기기에서 버그

*  발생 현상.
 유니티 모바일 빌드(android, ios) 에서 쉐이더 글로벌 변수 _Time 를 사용하는곳에 프레임 지날수록 오차가 더 생겨서 폴리곤 이동, UV 애니메이션이 툭툭 끊어지는 현상 발생.
 특히 폴리곤이 적은 파티클, 평면, 박스형태에서 잘 발생


* 해결방법 ( 모든 조건 충족해야함 )
1. C# 코드에서 매프레임 업데이트로 쉐이더에 시간 넣어줌.
 Shader.SetGlobalFloat( "_MyTime", Time.time )


2. 시간변수 필요한 쉐이더 내부에
float _MyTime; 정의한뒤 사용.


* 발생 원인 추측.
유니티에서 사용하는 시간은 float 타입이고, 쉐이더 내부에서는 float4 형태의 벡터로 넘겨주는데 PC 에서는 제대로 사용되지만 모바일에서는 half  타입 혹은 미세한 값을 날려버리는게 아닌가 추측됨.


*  half 타입 계산변수와 float 타입 시간 계산이 혼재될 경우
half2 offset = half2(0.5, 0.0);
half2 uv = (IN.uv_MainTex + off) * _MyTime;
float 타입 _MyTime 과 half 타입 계산이 섞여있을때 PC 에서는 문제없이 작동하지만,
모바일에서 _MyTime 을 half 로 변경한뒤 계산하는걸로 추측됨 (이펙트 끊어지는 문제 발생)

half2 uv = (IN.uv_MainTex + off) * float2(_MyTime, _MyTime);
이렇게 타입을 직접 지정하면 문제 발생안함


* 시간을 벡터 형태로 넘길경우
시간을 Shader.SetGlobalVector 를 이용해서 유니티 기본제공하는 _Time 변수처럼 셋팅하면 움직임이 튀는 문제 발생



댓글

이 블로그의 인기 게시물

안드로이드앱 개인정보 취급방침

[UNITY3D] 쉐이더 내에서 "행렬 * 벡터" 연산