Texture Streaming Mipmapの使用に関する疑問

今回の主な話題：Texture Streaming Mipmapの使用に関する疑問、UE4マテリアルで平行光の向きを取得する方法、SubmeshのあるSkinnedMeshRendererがBakeMeshを使う問題、PPS v2 後処理の最適化、動的にロードされたシャドウのベイク情報が無効する。

---
###Texture Streaming
Q1: プロジェクトは 2018.4 にアップグレードしました。今年中にリリースする予定があります。
1、Unity が StreamingMipmap ストリームを追加したのを見て、loadedMipmapLevelがテクスチャによって現在使用されている Mipmap levelであるかどうかを知りたいです。公式からの説明は「Which mipmap level is currently loaded by the streaming system.」です。試してみました、１つのオブジェクトに近づいても離れても、この値は固定です。そうではない場合には、現在テクスチャのMipmap levelを取得するにはどうすればよいですか?
2、Unity 2018.4はJob Systemを使えますか？公式が「これは実験的なものでクラッシュする可能性がある」と言いていますが、誰かがこれまたはStreamingMipmapをオンにしたリリースしたプロジェクトありますか？

>この値は実機では正確ですが、エンジン端末でいくらのロードBugが存在します。私たちのテストにもこの問題がありました。当時は、プロジェクトを再び創建して、再インポートした後に実機で正しく表示しました。
>
UWA DAY 2019 では、Texture Streamingのテストで発生した問題のいくつかと多数のStreamingロジックの説明について詳しく説明しました。問題主は興味があれば、確認することもできます、[「Unityエンジンのローディングモジュール とメモリ管理の数量化分析や最適化方法」（中国語注意）](https://edu.uwa4d.com/course-intro/1/91)。不必要なテストや手探りの時間を大幅に節約でき、キーボードを壊したり、コンピューターを投げたりするほどのクラッシュから解放されます。 (信じてください、この機能を調査していたとき、私たちの気分はこんな感じでした!)
>
2つ目のご質問についてですが、回答が難しいです。今まで、リリースしたプロジェクトでは見ることはありませんでした。ここで１つの記事があって、問題主や現在TextureStremingJobを使っているチームにお勧めします。[「TextureStreamingJob クラッシュ分析」](https://blog.jp.uwa4d.com/2021/05/28/texturestreamingjob-%e3%82%af%e3%83%a9%e3%83%83%e3%82%b7%e3%83%a5%e5%88%86%e6%9e%90/)

---
###Rending
Q2: Unity では、_WorldSpaceLightPos0を介して平行光の向きを取得できます。これは、Unity がこのuniformが頻繁に使われていると考え、自動的に渡されるためです。
Unreal のマテリアル ノードで長い間検索しましたが、Light Vectorのような平行光の方向を示すノードが見つかりませんでした。Unrealでは、Blueprintを介して自分が外部から渡せますだけですか？SetGlobalVector のように、Blueprint + Material Parameter Collectionsは私の要件に満たすことができることが知っています。ですから、マテリアル ノードから平行光の方向を直接取得できるかどうかを聞きたいです、自分が外部から渡したくないです。
>方法ならあります。下図のように、１つのcustomノードを作成し、パラメーターに図のようなコードを入力すればいいです。Material Functionに作成すると、どこでも再利用できます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/5f2df9f5-1bf5-eaa0-51b9-999cc00bf31f.png)
しかし、個人的には推奨していません。明らかにこれは非常にhackな方法です。この方法は、最下層Shaderの実現に依頼し、すべてのバージョンで使用できると保証できません(4.22 テスト)。
>
その原因は、Unrealはマテリアルエディターが提供する主なノードが、すべてのライティング プロセス（forward shading/defer shading）に適用すると仮定しましたからです。しかし、Light Directionを取得する設定は、明らかに複数の光源を持つDeferred Shadingに適応していません。ですから、公式自体はノードを提供しません。
>
ちなみに、このやり方はForward Shadingでしか使えません。Unityに似ていないで、自分が作成したShaderに対して、Epic公式は互換性を気にしません。このバージュンで使用できますが、次のバージュンがエンジンShaderを変更する場合には、まだ使用できるかどうかは分かりません（しかし、このコードはかなりの数のバージョンに適応できようです）。
ですから、問題主が言及した方法は、公式からの推奨です。
>
コード、
>
```ruby:code
#ifdef EyeAdaptationStruct
#if MATERIALBLENDING_ANY_TRANSLUCENT
return TranslucentBasePass.Shared.Forward.DirectionalLightDirection;
#else
return OpaqueBasePass.Shared.Forward.DirectionalLightDirection;
#endif
#else
return 0;
#endif
```

---
###Shader
Q3: サブメッシュを持つ SkinnedMeshRenderer が BakeMesh を使用して残像を作成すると、サブメッシュの最初のメッシュのみがベイクされることがわかりました。このキャラクターには 4 つのサブグリッドがあります。同様の問題が発生しましたか? (Unityバージュンは2017.4.18f1であり)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4758d0da-2700-40c5-036c-29b17d2da594.png)

>本来の実現方式はこのように、Graphicsを使ってMeshを直接描画することです。これは、結果から見るとサブメッシュをサポートしません。
>
```ruby:
Graphics.DrawMesh(ghostMesh.mesh, ghostMesh.position, ghostMesh.rotation, ghostMesh.material, 0, Camera.main);
```
修正した後、GameObjectをインスタンス化し、サブメッシュの数に対応するマテリアルを掛けたら、正常に表示できます。
>
```ruby:
public void InstanceGhost() {
    if (mesh.subMeshCount > 0) {
        ghostGo = new GameObject("ghostGo");
        SkinnedMeshRenderer smr = ghostGo.AddComponent<SkinnedMeshRenderer>();
        smr.sharedMesh = mesh;
        Material[] mats = new Material[smr.sharedMesh.subMeshCount];
        for (int i = 0; i < mesh.subMeshCount; i++) {
            mats[i] = material;
        }
        smr.materials = mats;
        ghostGo.transform.parent = GetGhostRoot();
        ghostGo.transform.position = position;
        ghostGo.transform.rotation = rotation;
    }
}
```

---
###Rending
Q4: 皆さんにお聞きたいです。現在の後処理の最適化は、この方面から始めますか？

①
>
Unity PostProcessは、コード方面での最適化スペースが限られており、プロジェクトの使用によってコードから若干の詳細を削除できます。この前にコード上の最適化はあまり多くないで、主にBugを解決するためでした。
>
使用上では、ポストエフェクトを計画できます。最も重要なポストエフェクトはBloomと ColoeGrading であります。その中、Bloomのパフォーマンスコストはより高いで、画面品質の高い場合にオンになれます。中品質では、ColorGraidingのみを使用し、画面の一貫性を保持します。低配置ではポストエフェクトをオフになされます。そして、他の画面を改善できる効果も多いです。例えば、被写界深度、SSAO、アンチエイリアス、Chromatic Aberration、Vignetteなど、状況によりオンやオフをデザインできます。デフォルトではオフです。

②
>
PostProcess Stack V2 を使用している場合は、ここを参照できます。
[https://www.bilibili.com/video/av53641372/?share_medium=web（中国語注意）](https://www.bilibili.com/video/av53641372/?share_medium=web)
この中の部分は、パフォーマンスに影響の大きいオプションについてたくさん説明しました。

---
###Lightmap
Q5: 現在、ベイク情報をシーンから分離する要件があります。つまり、私のプレハブはあらゆるシーンでシャドウを表示する必要があります。
インターネットで情報を検索したところ、プレハブのライトデータのlightmapIndexとlightmapScaleOffsetを記録し、ライトマップの設定をlightmapsettingにロードすればいいです。

しかし、テスト過程に、ここの設定は成功しました。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/43888d34-a2a8-ac84-2f50-e45ce2689813.png)
ここでも設定されていますが、有効になりません。 プレハブ全体はまだ黒です。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/919b161c-02e5-ec78-1d16-1ea36715d01e.png)
この設定を任意のデフォルトDataにすれば、前の流れで行われば有効になります。これはなぜですか？
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/95b4b9cc-b4d2-f935-07cf-ebb772fc172a.png)

>シーンを開いた後、またはPrefabをインスタンス化した後、手動で値を一回割り当てる必要があります。

---
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