Upgrading to Unity 5.6
Unity 5.4 へのアップグレード

Unity 5.5 へのアップグレード

シェーダー: 物理ベースのシェーディングコードの変更

物理ベースのシェーダー関連コードは Unity 5.5 でリファクタリングされました (UnityStandardBRDF.cginc ファイルなど)。手動で直接関数を呼び出さない限り、大抵はシェーダーコードに直接影響することはありません。主な変更は以下の通りです。

  • smoothness、roughness、perceptual roughness 間を変換する関数が加わりました。 PerceptualRoughnessToRoughness, RoughnessToPerceptualRoughness, SmoothnessToRoughness, RoughnessToSmoothness

  • UnityStandardBRDF.cginc 内の可視性の項は引数として roughness を取り、perceptualRoughness は取りません。

  • 古いバージョンの Unity では、Marmoset ラフネスでリマップを行うことが可能でした。これが GGX への変更により適合しなくなり、UNITY_GLOSS_MATCHES_MARMOSET_TOOLBAG2 の定義とその関連コードは削除されました。

  • G バッファ内からの読み出しと G バッファ内への書き込みはすべて、新しい関数 UnityStandardDataToGbuffer / UnityStandardDataFromGbuffer を経由するようになります。

  • Unity_GlossyEnvironmentData 構造体の初期化は、手動で行う代わりにシェーダーコードが UnityGlossyEnvironmentSetup() を呼び出すようになります。

  • Unity_GlossyEnvironmentDataroughness 変数は実際には perceptual roughness ですが、既存のシェーダーコードとの関連によるエラーを回避するために、名前は変更されていません。(注)UnityGlossyEnvironmentSetup はパラメーターとして smoothness を取り、perceptual roughness を計算します。

  • UnityLight 内の ndotl 変数の値がオンザフライで計算されるようになり、この変数内に書かれた一切の値は無視されます。

  • UNITY_GI マクロは非推奨となりましたので、今後の使用はお控えください。

【シェーダー】DirectX 9 の半ピクセルオフセットの問題

Unity 5.5 では、バックグラウンドで DX9 半ピクセルオフセット・ラスタライゼーションの処理が行われます。つまり、シェーダー内でもコード内でも DX9 の半ピクセル問題の修正を行う必要がなくなりました。詳細はこちらのブログ記事でご確認ください。以下のチェックのどれかをコード内で使用すれば問題を解消できるようになっています。

  • シェーダー内で UNITY_HALF_TEXEL_OFFSET にチェックを追加し、それに基づいて頂点/UV を移動させる
  • SystemInfo.graphicsDeviceType または SystemInfo.graphicsDeviceVersion 経由で D3D9 にチェックを追加し、それに基づいて頂点/UV を移動させる

現時点でのこの問題に対する Unity の解決方法は、コンパイルされているすべての頂点シェーダー内に半ピクセル調整コードを挿入することです。結果、頂点シェーダー定数レジスター c255 が Unity により確保され、2 つの命令がすべてのシェーダーに追加され、一時レジスターがもう 1 つ使用されます。これは、使用可能なすべての資源(定数/一時レジスターおよび命令スロット)を頂点シェーダーが完全に使い切ってしまわない限りは問題にはならないはずです。

【シェーダー】Z バッファ float の反転

Z バッファ(デプスバッファ)の方向が反転されました。つまり、Z バッファの値がニアのクリッピング平面で 1.0、ファーのクリッピング平面で 0.0 になります。これが浮動小数点デプスバッファと組み合わさることでデプスバッファの精度が著しく高まり、その結果 Z ファイティングが削減されシャドウの質が向上します。これは特に、小さなニアのクリッピング平面と大きなファーのクリッピング平面を使用する場合に顕著です。

Graphics API に関する変更

  • 頂点シェーダーの出力するクリップスペース位置の範囲が [0, far] から [near, 0] に変更されました。
  • _CameraDepthTexture テクスチャの範囲が [0,1] から [1,0] に変更されました。
  • Z バイアスが、適用される前に無効化されます。
  • 24 ビットデプスバッファが 32 ビット float 形式に変更されました。

次のマクロ/関数によって、追加の手順無しでリバース Z のケースを処理できます。シェーダーですでにこれらを使用している場合は、何の変更も加える必要はありません。

  • Linear01Depth(float z)
  • LinearEyeDepth(float z)
  • UNITY_CALC_FOG_FACTOR(coord)

ただし、Z バッファの値を手動でフェッチしている場合は、以下のようなコードの記述が必要になります、

float z = tex2D(_CameraDepthTexture, uv);
#if defined(UNITY_REVERSED_Z)
    z = 1.0f - z;
#endif

クリップスペースのデプスには次のマクロを使用できます。(注) このマクロは OpenGL/ES プラットフォームでクリップスペースに変更を加えることはなく、[-near, far] として残ります。

float clipSpaceRange01 = UNITY_Z_0_FAR_FROM_CLIPSPACE(rawClipSpace);

_ZBufferParams がリバースのデプスバッファがあるプラットフォームで 3 つの値を含むようになりました。詳細はドキュメントのプラットフォーム特有のレンダリングの違いに関するページをご覧ください。

x = -1+far/near
y = 1
z = x/far
w = 1/far

Z バイアスは Unity によって自動で処理されますが、ネイティブコードのレンダリングプラグインをご使用の場合は、対応プラットフォームの C/C++ コード内でそれを無効化する必要があります。

【特殊フォルダー】Unity エディターの “Resources” サブフォルダー

“Editor” という名前のフォルダーのサブフォルダーはすべてビルドから除外され、Unity エディターの再生モードで読み込まれなくなります。以前は “Resources” という名前のサブフォルダーのアセットがビルドに含まれていました。これらのアセットは今後も、エディタースクリプト内で Resources.Load() を呼び出すことで読み込むことができます。

例えば、下記のファイルはビルドから除外され、エディターの再生モードでは__読み込まれません__が、スクリプトから呼び出せば__読み込まれます__。

  • Editor/Foo/Resources/Bar.png (エディターコードから “Bar.png” として読み込まれます。)
  • Editor/Resources/Foo.png
  • Editor/Resources/Editor/Resources/Foo.png (エディターコードから “Foo.png” として読み込まれます。“Editor/Resources/Foo.png” としては読み込まれません。)

下記のアセットは、すべての状況において読み込まれます。

  • Resources/Editor/Foo.png
  • Resources/Foo/Editor/Bar.png (“Foo/Editor/Bar.png” として読み込まれます。)
  • Resources/Editor/Resources/Foo.png (“Foo.png” として読み込まれます。“Editor/Resources/Foo.png” としては読み込まれません。)

Backface Tolerance と Final Gather

これまでは、ライトマップパラメーター 内の ‘Backface Tolerance’ パラメーターはベイク済 GI にファイナルギャザーを使用している場合には適用されませんでしたが、これが正しく適用されるようになりました。このパラメーターは、リアルタイム GI およびベイク済 GI の両方の段階(ファイナルギャザーを含む)に影響を与えるようになりました。

これによって主に影響を受けるシーンは、片面のジオメトリ(ビルボードなど)があって、そのようなジオメトリの裏面にあるテクセルが無効化されてしまうのを避けるために ‘Backface Tolerance’ の調整が必要になるようなシーンです。ビルボードとファイナルギャザーを使用しているシーンでは ‘Backface Tolerance’ を調整することでライトマップの質をより高められるようになりました。ただし、デフォルトでない ‘Backface Tolerance’ が適用されている場合は、現在これはファイナルギャザーの段階に正しく割り当てられているため、他のシーンにも影響を及ぼす可能性があります。

スタンダードシェーダー BRDF2 が GGX の近似を使用

BRDF2 はモバイルプラットフォームでのデフォルトに設定されている標準のシェーダータイプです。このタイプのシェーダーが Blinn-Phong ではなく GGX 近似を使用するように変更されました。これにより、見た目が BRDF1(デスクトップ用のデフォルト)により近くなり、ビジュアルの品質が向上されます。

レガシーの近似計算を保持する必要がある場合は、#if UNITY_BRDF_GGX 命令文内に新しい実装を持つ UnityStandardBRDF.cginc 内で、BRDF2 コードを修正してください。(これは BRDF1 も GGX の選択のために使用しています)。BRDF2_Unity_PBS 関数内で、UnityStandardConfig.cginc 内の定義を変更するか、#if UNITY_BRDF_GGX を #if 0 に変更してください。

Android の Gradle

Android 向けビルドに Gradle が使用可能になりました。

Gradle は既存の Unity Android ビルドシステムと比較して、エラーの検知基準が緩くなっています。このため、一部の既存のプロジェクトでは Gradle への変換が難しい場合があります。このようなビルド障害の特定と解決方法については、Gradle のトラブルシューティングをご覧ください。

Instantiate のオブジェクトオーバーロードに関する変更

Instantiate 関数の特定のオーバーロード(デフォルトで元々のゲームオブジェクトのパラメーター 1 つと親 Transform のパラメータ―を 1 つ取るもの)の挙動が変更されました。元々のゲームオブジェクトの位置・角度をワールド空間での位置・角度として認識しなくなったため、指定された親 Transform の位置・角度を無視します。

現在はデフォルトで、位置・角度を、指定の親 Transform 内のスペース内におけるローカルの位置・角度として認識するようになっています。これはエディター内の挙動と一致しています。スクリプトは自動では更新されません。したがって、この Instantiate のオーバーロードへの呼び出しを含む、今回の変更に対応した更新の行われていないスクリプトを実行すると、予期せぬ挙動が発生する可能性があります。

レンダラーと LOD Group コンポーネントの挙動

LOD Group コンポーネントを無効化しても、それにアタッチされたレンダラーは無効化されなくなりました。LOD Group の設定がレンダラーに適用されるのは、LOD Group コンポーネントが有効になっている場合のみです。この変更は、プロジェクトのアップグレード時に Unity によって自動的に適用され、一度変更すると元に戻すことができません。

Upgrading to Unity 5.6
Unity 5.4 へのアップグレード