Unity5.5でデプスバッファのnearとfarが入れ替わった話


EffekseerがUnity5.5β環境で描画がおかしくなるという報告がありました。

報告によるとデプスバッファの仕様変更が影響しているんじゃないかとのこと。

どうやら5.5からの仕様変更のようです。
逆floatアルゴリズムによって影の品質が改善するとか。

影響があるプラットフォーム

  • Windows DirectX11
  • Windows DirectX12
  • macOS/iOS Metal
  • PS4

影響があるケース

  • ポストエフェクト等でデプスバッファを使っている
  • ネイティブプラグインで描画している

ポストエフェクト等でデプスバッファを使っている

SAMPLE_DEPTH_TEXTURE で生のデプス値を使っている場合は対策が必要です。
UNITY_REVERSED_Z というシェーダ定義が追加されたそうなので、以下のようにプリプロセッサ分岐してやるのがよさそうです。

#if defined(UNITY_REVERSED_Z)
    o.pos.z -= _MotionVectorDepthBias * o.pos.w;
#else
    o.pos.z += _MotionVectorDepthBias * o.pos.w;
#endif

ネイティブプラグインで描画している

普通に描画していても、デプステストは大体していると思うので対策必須です。
Unityバージョンとグラフィックスデバイスタイプを見て、デプステストのDepthFuncを切り替えましょう。

if (unityReversedZ) {
    depthFunc = D3D11_COMPARISON_GREATER;
} else {
    depthFunc = D3D11_COMPARISON_LESS;
}