2018의 게시물 표시

[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 변수처럼 셋팅하면 움직임이 튀는 문제 발생

[Unity] 유니티 Tier settings 에 따른 쉐이더 컴파일 용량 차이

이미지
 유니티 Project settings -> Graphics 탭에  Tier Settings 항목들이 아래와 같이 있는데,  미리설정된 Tier 중 현재 Tier를 실시간으로 선택할 수 있어서 기기 스펙에 따른 그래픽 옵션 설정이 가능하지만, 단점은 컴파일 되는 쉐이더의 길이가 늘어나서 쉐이더 파일이 차지하는 메모리 용량이 늘어난다. 단순히 계산해서 만약 쉐이더파일 하나가 컴파일된 결과가 50라인이라고 하면,  "50라인 * (Tier 1,2,3 에 대응하는 3종류)  =  150 라인"이 된다. 실제로는 Tier 마다 세부 선택 항목이 달라서 쉐이더 라인수는 Tier 마다 다르다.  이 기능 쓰지 않으려면, 모든 Tier 의 세부 사항들을 똑같이 설정하면, 한종류의 컴파일된 쉐이더 파일을 얻을 수 있다.