또 플랫폼마다 다르게 동작하는 문제가 있다.

바로 shader에서 float 타입 변수를 선언할 때마다 결정하는 것이 정확도이다.

지금까지는 이걸 굳이 신경 안써도 잘 동작해서, 왜 이런게 존재하나 했었는데. 최근에 이 차이로 인한 문제를 경험했다.


Specular와 Overlight를 지원하는 shader를 구현하여 모바일 빌드를 했는데, Android와 iOS의 화면이 다르다.

Android에서는 정상적으로 출력되는데 iOS에서는 하얗게 타서 나오는 것이다.

원인을 찾아보니, spec과 glow를 처리하는 코드에서 fixed 타입 변수를 사용했는데, 이 타입 변수는 정확도 뿐만 아니라 표현할 수 있는 범위도 매우 제한적이어서, 정확한 계산이 안 되는 것이다.

그런데 이 문제는 iOS에서만 발생한다. 즉 각 플랫폼마다 또 동작이 다르다.. (이구~~~)


문서를 보면, fixed는 -2 ~ + 2까지만 표현되고, half는 2**-15 ~ 2**+15 까지 표현된다고 한다.

보통 spec과 glow는 큰 값이 들어오므로, 이들의 외부 parameter 선언을 half로 선언하니 문제가 해결되었다.

Posted by 바람인생
,

Varying Semantic 중 Color가 iOS와 PC, Android가 다르게 동작한다.

모자란 TEXCOORD# 대신에 COLOR0과 COLOR1을 사용하여 조금이라도 절약을 하는데...


COLOR는 원래 fixed function 시절 부터 LDR color를 전달하기 위한 용도로 사용되었다.

따라서 이 COLOR semantic으로 전달되는 varying 값은 0~1 의 범위값을 가지며, clamp 된다.


하지만 디바이스 사양이 좋아지면서, iOS에서는 이 제한을 굳이 안 지키고, 범위를 초과하는 값다 잘 전달해 준다.


하지만 PC와 Android기기는 여전히 이 제한을 가지고 있다.


따라서 이 것을 사용하는 shader 코딩을 하고, 범위를 초과하는 값을 전달하는 경우에는 각 platform마다 다른 결과가 나온다.

Posted by 바람인생
,

surface shader가 아니라, 일반 vertex / fragment shader를 작성하게 되면, 많은 부분을 신경써야 한다.

그중에 최근 경험한 것이 shadow map 적용가능하게 하려면, shader에 한가지 코드를 추가해야 한다.

Fallback "VertexLit" 라는 문장이다.

Fallback은 shader 코드의 맨 마지막 block 에 추가한다.

이 문장이 없으면, Shader Inspector에 Cast Shadows가 "No"로 나온다. 이름은 Cast이지만, 이 값이 "No"로 나오면, Receive Shadows도 동작하지 않게 된다.



이상한 Unity3D shader의 세계~~~

Posted by 바람인생
,