3Dレンダリングの制限

はじめに

リアルタイムレンダリングエンジンはパフォーマンスに重点を置いているため、多くの制限があります。Godot のレンダラーも例外ではありません。効果的にレンダリングさせるには、様々な制限を理解する必要があります。

テクスチャサイズの制限

デスクトップやラップトップでは、8192×8192 より大きいテクスチャは古いデバイスではサポートされない可能性があります。ターゲット GPU の制限については、GPUinfo.org で確認できます。

モバイルGPUは通常、テクスチャは 4096×4096 までに制限されています。また一部のモバイル GPU は、2の累乗サイズ以外のテクスチャのリピートをサポートしていません。したがってテクスチャをすべてのプラットフォームで正しく表示したい場合は、4096×4096 より大きいテクスチャの使用を避け、テクスチャをリピートする必要がある場合は2の累乗サイズを使用する必要があります。

レンダリングするには大きすぎる可能性がある特定のテクスチャのサイズを制限するには、インポートオプションの インポートプロセス > サイズ制限0 より大きい値に設定します。これによりソース ファイルに影響を与えることなく、インポート時にテクスチャのサイズが縮小されます (アスペクト比は維持されます)。

色の縞模様 (バンディング)

When using the Forward+ or Mobile rendering methods, Godot's 3D engine renders internally in HDR. However, the rendering output will be tonemapped to a low dynamic range so it can be displayed on the screen. This can result in visible banding, especially when using untextured materials. For performance reasons, color precision is also lower when using the Mobile rendering method compared to Forward+.

互換性レンダリングを使用する場合、HDR は使用されず、色の精度はすべてのレンダリング方法の中で最も低くなります。これは2Dレンダリングにも当てはまり、滑らかなグラデーションテクスチャを使用するとバンドが見える場合があります。

バンディングを軽減するには、主に2つの方法があります。

  • If using the Forward+ or Forward Mobile rendering methods, enable Use Debanding in Project Settings > Rendering > Anti Aliasing. This applies a fullscreen debanding shader as a post-processing effect and is very cheap.

  • あるいはテクスチャにノイズを焼き付けます。これは主に2Dで効果的で、たとえばビネット効果を使うときに有効です。3Dでは カスタムデバンドシェーダー を使用して マテリアル に適用することもできます。このテクニックはプロジェクトが低い色精度でレンダリングされている場合でも機能します。つまりモバイルおよび互換性レンダリングを使用する場合も機能します。

色のバンディングの比較(視認性を高めるためにコントラストを強めています)

色のバンディングの比較(視認性を高めるためにコントラストを強めています)

参考

バンディングとその対処方法の詳細については Banding in Games: A Noisy Rant (PDF) を参照してください。

深度バッファの精度

3D空間でオブジェクトをソートするために、レンダリングエンジンは 深度バッファ (Zバッファとも呼ばれます) に依存します。パフォーマンス上の理由からこのバッファの精度は有限で、デスクトッププラットフォームでは24ビット、モバイル プラットフォームでは16ビットになることもあります。2つの異なるオブジェクトが同じバッファ値になると、Zファイティングが発生します。これはカメラが移動または回転するとテクスチャが前後にちらつくことで現れます。

レンダリングされた領域で深度バッファをより正確にするには、Cameraノードの Near プロパティを 増やす 方法があります。ただし注意が必要で、Near値が高すぎるとプレイヤーは近くのジオメトリが透明になってしまいます。またCameraノードの Far プロパティを、使用ケースで許容される最小値まで 減らす 方法もありますが、Near プロパティほど精度に影響しないことに注意してください。

プレイヤーが遠くを見るときにのみ高精度にする場合は、ゲームの状況に応じて動的に変更することもできます。たとえばプレイヤーが飛行機に乗ったとき、遠くのZファイティングを回避するために、Near プロパティを一時的に増加させます。そしてプレイヤーが飛行機を離れたら、Near プロパティを減らします。

シーンや表示条件によっては、プレイヤーに違いが見えない状態で、Zファイティングが発生するオブジェクトをさらに離すこともできます。

Z ファイティングの比較 (Label3D を床からオフセットしてシーンを微調整する前と後)

Z ファイティングの比較 (Label3D を床からオフセットしてシーンを微調整する前と後)

半透明のソート

Godot では半透明マテリアルは不透明マテリアルの後に描画されます。半透明オブジェクトはワールド空間の頂点位置ではなく、Node3D の位置に基づいて描画される前に後ろから前にソートされます。このため重なり合ったオブジェクトは順序どおりにソートされないことがよくあります。不適切にソートされたオブジェクトを修正するには、マテリアルの レンダリング優先順位 プロパティまたはノードの ソートオフセット を微調整します。レンダリング優先順位は特定のマテリアルを他の半透明マテリアルの前または後ろに表示するように強制し、ソートオフセットはソートのためにオブジェクトを前後に移動します。しかしこれらを行っても、必ずしも十分ではない場合があります。

一部のレンダリングエンジンでは、この問題を軽減するために 順序に依存しない半透明 技術を採用していますが、これは GPU に負担がかかります。Godot は現在この機能を提供していません。この問題を回避する方法はいくつかあります。

  • 実際に必要なものだけマテリアルを半透明にしてください。マテリアルに小さな半透明部分しかない場合は、別のマテリアルに分割することを検討してください。これにより不透明部分は影を落とすことができ、パフォーマンスも向上します。

  • テクスチャのほとんどが完全に不透明で完全に半透明な領域である場合は、アルファブレンディングの代わりにアルファテストを使用できます。この透過モードはレンダリングが高速で、半透明の問題が発生しません。StandardMaterial3D で Transparency > Transparency から Alpha Scissor を有効にし、必要に応じて Transparency > Alpha Scissor Threshold を調整します。マテリアルのプロパティでアルファアンチエイリアシングが有効になっていない限り、MSAA はテクスチャのエッジをアンチエイリアシングしないことに注意してください。ただし、FXAA、TAA、およびスーパーサンプリングは、マテリアルでアルファアンチエイリアシングが有効になっているかどうかに関係なく、テクスチャのエッジをアンチエイリアシングできます。

  • テクスチャの半透明領域をレンダリングする必要がある場合、アルファシザーは適していません。代わりに StandardMaterial3D の Transparency > Transparency プロパティを Depth Pre-Pass に設定すると、機能する場合があります (いくらかパフォーマンス コストがかかります)。Alpha Hash モードを試すこともできます。

  • 距離に応じてマテリアルをフェードさせたい場合は、Pixel Alpha ではなく、StandardMaterial3D 距離フェード モードの Pixel Dither または Object Dither を使用します。これによりマテリアルが不透明になり、レンダリングも高速化されます。

半透明のタイプの比較(左がアルファブレンド、右がアルファシザー)

半透明のタイプの比較(左がアルファブレンド、右がアルファシザー)