
一、要求
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番目、リアルタイムシャドウ外になるとダメです。
4M静的Shadowmaskの効果:
原理:シーンに対し、深度マップを記録する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公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com
UWA公式Q&Aコミュニティ(中国語注意):https://answer.uwa4d.com
これも興味あるかも
-
原理から応用まで ゲームでの動的解像度
January 4, 2023 -
Unityゲームの使用メモリを最適化しよう
December 21, 2022 -
ASTC テクスチャ圧縮形式の紹介
December 14, 2022