ビッグワールドツリーシャドウスキームコレクション

## 一、要求

 
UnityエンジンによるTerrainの木の影の処理はちょっと粗末なので、プロジェクトの要件を満たさないことがよくあります。動的オブジェクトがLight Probeをサンプリングする場合、デフォルトでは、木に対してLightmapをベイクしません。しかし、このような大きな動的オブジェクトのlight probe proxy volume（サポートしない、サポートに変更するとスタックする）でさえ、間接光と大規模なオクルージョンが豊富にしただけ、セルフシャドウ効果を効果的に表現できません。リアルタイムの影の距離になると、画像ははるかに悪くなります。そして、手元にある「生と死の狙撃兵2」は、4億の研究開発を投資した大規模なプロジェクトです。グラフィックスレンダリング技術の担当者として、私は当然、多くの技術的解決策を試して比較する必要があります。
 
**具体的には、50メートル以内でShadowmapを使用することです。50〜1500メートル以内に平行光の影が必要であり、平行光は静的です。**
 
このニーズを満たす7つのスキーマを次に示します。
 
>１、インスタンスで再利用可能な無方向間接光の影をベイクする
２、ベーキングインスタンスの再利用+回転可能な指向性ライトシャドウ
３、低精度の事前計算された静的シャドウマップシャドウ
４、スパースオクトツリーボクセル化静的シャドウ
５、画面スペースの接触リアルタイムシャドウ
６、低精度の高さマップに基づくリアルタイムのシャドウ
７、距離フィールド加速光線マーチングシャドウ
 
### スキーマ1：インスタンスで再利用可能な無方向間接光の影をベイクする

 
これは一番簡単な方法で、3DsMaxで空の光を使用してAOに似た影をベイクます。これにより、木は任意の角度の回転や任意の角度の太陽光に交換性があり、アセットの再利用率も高くなります。しかし、平行光の影は、少しアンリアルで適合性にも乏しい。このようなベイク図を取得してから、木の2セットのUVに作用します。コードも非常に簡単で、SpeedTreeCommon.cginc内にUV1パスを追加し、最後に*をAlbedoに追加するだけです。これは、AOが間接光に十分な効果がないためです。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/0195d90a-3122-5dcf-30ad-5fdbb4f9e2aa.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/f60a6fd1-d4ff-d041-0e1b-824f782bfdb8.png)




Max-bakedによってベイクされたAO図を木のPrefabにバインディングして再利用する。Unityベイクは再利用できず、方向性もある。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/04362b9d-b5f6-9f6b-e2cc-b6c7357bdb52.png)


リアルタイムシャド内
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/45983f9b-da85-5474-dd05-5ec159ef59cf.png)


リアルタイムシャドウの外

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6763f80d-a793-b78c-b9b0-bf8356822581.png)

このスキーマの効果
**利点**：シンプルで使いやすく、4行のコードで実現され、高性能で、低解像度の画像が1回サンプリングされます。
 
**欠点**：方向光は考慮されず、シャドウはそれ自体でのみ改善でき、木の下の動的オブジェクトを遮ることができません（静的ならShadowmaskをベイク処理できます）。
 
### スキーマ2：インスタンスで再利用可能な+回転可能な平行光の影をベイクする

 
前のスキームより、方向も考慮に入れたのです。このような8つの並列ライトベイキングマップをベイク処理します。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/30394429-fe73-60b6-6b63-6eeb9bf876fe.png)

木インスタンスのさまざまな方向に応じてさまざまなAOマップが設定されますが、木は地形に設定するのが不便であるため、配列またはアトラスに作成できます。Shaderでは、方向に応じてIndexまたはOffsetを取得します。効果が前の効果と似ていますが、方向性が優れています。各方向は比較的正規分布です。8方向では不十分だと思われる場合は、2方向の補間や16方向のマップを作成できます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/b9e89b7c-c2d5-20a3-dc8b-f1e8c552f8b6.png)


このスキームの効果
**利点**：シンプルで使いやすく、高性能で、低解像度のアトラスが1〜2回サンプリングされ、回転をサポートし、方向性シャドウがあります。
 
**欠点**：太陽の角度が異なるマップでは、別のテクスチャセットが必要になる場合があります。シャドウを改善できるのは自分だけで、木の下の動的オブジェクトを遮ることはできません（静的ならShadowmaskをベイク処理できます）。
 
### スキーム3：精度の低い事前計算された静的Shadowmapシャドウ

 
まず、リアルタイムシャドウ内の効果を比較します。葉のセルフシャドウは悪くありませんが、2番目、リアルタイムシャドウ外になるとダメです。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ea8626e2-d1c0-5ae9-89d6-898e9e78780d.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/d8f33a64-5107-2a7c-3369-8939ec9cf0a2.png)




4M静的Shadowmaskの効果：
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/bff24cf2-da13-496f-9b3e-f8bff025f0dc.png)


**原理**：シーンに対し、深度マップを記録するShadowmap、ライトカメラを記録するmatrix_vpをオフラインで撮影します。ただ、このような大規模な撮影では深度精度が足りないので、16ビットではなく、RGBA32で深度を圧縮します。だから、縞模様に見えました。
 
**利点**：影があるだけでなく、遠くにいるキャラクターなどの動的なオブジェクトを遮るすることもできます。実装が簡単で、実行時にDraw Callsを節約でき、遠くのシーンを繰り返し撮影する必要がありません。
 
**欠点**：ビデオメモリが大きい。
 
**アップグレードし続けるスキーム**：仮想テクスチャに基づく静的ShadowmapまたはTexture streamingのShadowmap。
 
前のプロジェクト：[https://github.com/jackie2009/ScrollingStaticShadowmap](https://github.com/jackie2009/ScrollingStaticShadowmap)
 
## スキーマ4：スパースオクトリーでボクセル化された静的シャドウを実現する

 
0.9Mで影をボクセル化する効果：

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/718830e7-7312-8d8d-6578-7b7328df16ba.png)

 
**原理**：0.5メートルごとに1つの立方体、0または1を記録して影にあるかどうかを示します、オクトリーのノードとします。次に、ツリー圧縮によってメモリを節約します。
 
**利点**：影があるだけでなく、遠くのキャラクターなどの動的オブジェクトを遮ることもできます。実行時にDraw Callを節約でき、遠くのシーンを繰り返し撮影する必要がありません。Shadowmapよりビデオメモリが節約られます。
 
**欠点**：実装はより複雑であり、事前計算の書き込みは、同時実行性が高い場合にのみ高速になります。Shaderは、結果を照会するために複数のサンプリングを必要とします。
 
プロジェクトファイル：[https://github.com/jackie2009/ocTreeVoxelizedShadows/](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