一、要求
UnityエンジンによるTerrainの木の影の処理はちょっと粗末なので、プロジェクトの要件を満たさないことがよくあります。動的オブジェクトがLight Probeをサンプリングする場合、デフォルトでは、木に対してLightmapをベイクしません。しかし、このような大きな動的オブジェクトのlight probe proxy volume(サポートしない、サポートに変更するとスタックする)でさえ、間接光と大規模なオクルージョンが豊富にしただけ、セルフシャドウ効果を効果的に表現できません。リアルタイムの影の距離になると、画像ははるかに悪くなります。そして、手元にある「生と死の狙撃兵2」は、4億の研究開発を投資した大規模なプロジェクトです。グラフィックスレンダリング技術の担当者として、私は当然、多くの技術的解決策を試して比較する必要があります。
具体的には、50メートル以内でShadowmapを使用することです。50〜1500メートル以内に平行光の影が必要であり、平行光は静的です。
このニーズを満たす7つのスキーマを次に示します。
1、インスタンスで再利用可能な無方向間接光の影をベイクする
2、ベーキングインスタンスの再利用+回転可能な指向性ライトシャドウ
3、低精度の事前計算された静的シャドウマップシャドウ
4、スパースオクトツリーボクセル化静的シャドウ
5、画面スペースの接触リアルタイムシャドウ
6、低精度の高さマップに基づくリアルタイムのシャドウ
7、距離フィールド加速光線マーチングシャドウ
スキーマ1:インスタンスで再利用可能な無方向間接光の影をベイクする
これは一番簡単な方法で、3DsMaxで空の光を使用してAOに似た影をベイクます。これにより、木は任意の角度の回転や任意の角度の太陽光に交換性があり、アセットの再利用率も高くなります。しかし、平行光の影は、少しアンリアルで適合性にも乏しい。このようなベイク図を取得してから、木の2セットのUVに作用します。コードも非常に簡単で、SpeedTreeCommon.cginc内にUV1パスを追加し、最後に*をAlbedoに追加するだけです。これは、AOが間接光に十分な効果がないためです。
Max-bakedによってベイクされたAO図を木のPrefabにバインディングして再利用する。Unityベイクは再利用できず、方向性もある。
リアルタイムシャドウの外
このスキーマの効果
利点:シンプルで使いやすく、4行のコードで実現され、高性能で、低解像度の画像が1回サンプリングされます。
欠点:方向光は考慮されず、シャドウはそれ自体でのみ改善でき、木の下の動的オブジェクトを遮ることができません(静的ならShadowmaskをベイク処理できます)。
スキーマ2:インスタンスで再利用可能な+回転可能な平行光の影をベイクする
前のスキームより、方向も考慮に入れたのです。このような8つの並列ライトベイキングマップをベイク処理します。
木インスタンスのさまざまな方向に応じてさまざまなAOマップが設定されますが、木は地形に設定するのが不便であるため、配列またはアトラスに作成できます。Shaderでは、方向に応じてIndexまたはOffsetを取得します。効果が前の効果と似ていますが、方向性が優れています。各方向は比較的正規分布です。8方向では不十分だと思われる場合は、2方向の補間や16方向のマップを作成できます。
このスキームの効果
利点:シンプルで使いやすく、高性能で、低解像度のアトラスが1〜2回サンプリングされ、回転をサポートし、方向性シャドウがあります。
欠点:太陽の角度が異なるマップでは、別のテクスチャセットが必要になる場合があります。シャドウを改善できるのは自分だけで、木の下の動的オブジェクトを遮ることはできません(静的ならShadowmaskをベイク処理できます)。
スキーム3:精度の低い事前計算された静的Shadowmapシャドウ
まず、リアルタイムシャドウ内の効果を比較します。葉のセルフシャドウは悪くありませんが、2番目、リアルタイムシャドウ外になるとダメです。
原理:シーンに対し、深度マップを記録するShadowmap、ライトカメラを記録するmatrix_vpをオフラインで撮影します。ただ、このような大規模な撮影では深度精度が足りないので、16ビットではなく、RGBA32で深度を圧縮します。だから、縞模様に見えました。
利点:影があるだけでなく、遠くにいるキャラクターなどの動的なオブジェクトを遮るすることもできます。実装が簡単で、実行時にDraw Callsを節約でき、遠くのシーンを繰り返し撮影する必要がありません。
欠点:ビデオメモリが大きい。
アップグレードし続けるスキーム:仮想テクスチャに基づく静的ShadowmapまたはTexture streamingのShadowmap。
前のプロジェクト:https://github.com/jackie2009/ScrollingStaticShadowmap
スキーマ4:スパースオクトリーでボクセル化された静的シャドウを実現する
0.9Mで影をボクセル化する効果:
原理:0.5メートルごとに1つの立方体、0または1を記録して影にあるかどうかを示します、オクトリーのノードとします。次に、ツリー圧縮によってメモリを節約します。
利点:影があるだけでなく、遠くのキャラクターなどの動的オブジェクトを遮ることもできます。実行時にDraw Callを節約でき、遠くのシーンを繰り返し撮影する必要がありません。Shadowmapよりビデオメモリが節約られます。
欠点:実装はより複雑であり、事前計算の書き込みは、同時実行性が高い場合にのみ高速になります。Shaderは、結果を照会するために複数のサンプリングを必要とします。
プロジェクトファイル:https://github.com/jackie2009/ocTreeVoxelizedShadows/
スキーム5、6、および7:各デモ開発はより複雑であり、後で更新されるか、別の記事になります。
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、パフォーマンス分析と最適化ソリューション及びコンサルティングサービスを提供している会社でございます。
今なら、UWA GOTローカルツールが15日間に無償試用できます!!
よければ、ぜひ!
UWA公式サイト:https://jp.uwa4d.com
UWA GOT OnlineレポートDemo:https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ:https://blog.jp.uwa4d.com