【Unity】シェーダーのZ値計算結果が端末毎に異なる現象について

DEVELOP, Unity

素直にでシェーダープログラムを書いていて、得られる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 スクリプトリファレンス

Posted by kazupon