circle-loader
by
195/ 0

一、要求

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