【Unity】シェーダーのZ値計算結果が端末毎に異なる現象について
素直にでシェーダープログラムを書いていて、得られるZオフセットの値がプラットフォーム毎にバラバラな事件が起きました。これでは計算結果がずれてしまいます。そこで、シェーダープログラムの中で処理を分ける形をとりました。
vertexOutput vert(appdata IN)
{
vertexOutput OUT = (vertexOutput)0;
OUT.HPosition = UnityObjectToClipPos(IN.Vertex);
OUT.UV.xy = IN.UV.xy;
OUT.UV.xy *= _MainTex_ST.xy; //スケール
OUT.UV.xy += _MainTex_ST.zw; //オフセット
OUT.Color = IN.Color;
#if defined(SHADER_API_MOBILE)
_DepthOffset *= 2;
#endif
//Zオフセット
#if defined(UNITY_REVERSED_Z)
OUT.HPosition.z += _DepthOffset * 0.025;
#else
OUT.HPosition.z -= _DepthOffset * 0.025;
#endif
return OUT;
};
大事なのは以下の二つの定義
UNITY_REVERSED_Z
SHADER_API_MOBILE
詳しくは公式を見てみると良いです。
BuiltinShaderDefine – Unity スクリプトリファレンス