URPとBuilt-inのLight Colorは一致していない

1）URPとBuilt-inのLight Colorは一致していない
2）MSAAが有効になっているRenderTargetは、MSAAが有効になっていないRenderTargetに影響を与える
3）キャラクターMeshマージの長所と短所
4）NGUIレンダリング階層の原理
5）UnityでAppアイコンがデバイスにインストールされるとぼやけにならない設定の注意点
 
##Rendering

**Q：LightのIntensityが1でない場合、URPの下でとBuilt-inパイプラインの下でライトの色が一貫していないことがわかりました。Unity 2019.4.11f1を使用する添付ファイルは、それぞれURPとBuilt-inパイプライン（両方とも線形空間）のプロジェクトです。（添付ファイルは、[元のQA](https://blog.jp.uwa4d.com/2022/02/18/urpとbuilt-inのlight-colorは一致していない/)をクリックしてダウンロードできます）**
 
**再現方法：
１、2つのプロジェクトのScene1を開き、このシーンの指向性光Intensity値を1に設定します。 2つのプロジェクトのボールのライトの色が同じであることは観察できます。これは、FrameDebuggerでも確認できます。**
 
**２、2つのプロジェクトのScene2を開き、このシーンの指向性光Intensity値を0.65に設定します。 Built-inパイプラインはより暗いであることは観察できます。これは、FrameDebuggerでもBuilt-inパイプラインの値がより小さいであると確認できます。**
 
 
**URPの色：**
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/716842e6-7f6b-8d5f-14c0-657302cf0f98.png)


 
**Built-inの色：**

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4148145f-6494-e111-6626-2993a2d71417.png)

 
**URP FrameDebugger：**
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/b5eb0d33-fb1c-3780-e40a-e56f4fcea9bc.png)


 
**Built-in FrameDebugger：**
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/8b9d0a99-6f5a-26b4-db34-3243725e8d96.png)


 
>A：問題主のDemoのLightの色で計算します。Light設定項目のLight Colorは（0、202、255）、202.0 / 255 = 0.792です。
SRP：
Greenチャンネル：
Mathf.GammaToLinearSpace（0.792）* 0.65 = 0.5906189 * 0.65 = 0.383902285
Blueチャンネル：
Mathf.GammaToLinearSpace（1）* 0.65 = 1 * 0.65 = 0.65
Built-in：
Greenチャンネル：
Mathf.GammaToLinearSpace（0.792 * 0.65）= 0.2280943
Blueチャンネル：
Mathf.GammaToLinearSpace（0.65）= 0.3800563
これは、次の2つの段落の計算の違いである必要があります。
GammaToLinearSpace（m_ColorFilter * m_Intensity）;
GammaToLinearSpace（m_ColorFilter）* m_Intensity;
GraphicsSettings.lightsUseLinearIntensityの値が異なるのが原因であることがわかりました。この値は、SRPではTrue、Built-inではFalseです。
 
##Rendering

**Q：同じフレームに、MSAAをオンにするレンダリングするためのRenderTargetと、熱変形（heat distortion）効果のためのディストーションBuffと、MSAAをオンにしていないRenderTargetがあります。このディストーションBuffは、変形効果を実現するために、後処理でUVをオフセットするために使用されます。PCとiOSではすべて正常に動作しますが、Androidの実機では異常になります。Qualcomm GPUでは、このディストーションBuffにより画面がメッシュのように表示されます。MaliGPUでは、さまざまな小さな黒い四角が表示されます。おそらく何か不明な原因で、ディストーションBuffのデータが望まないステータスに処理されます。**
 
**他のRenderTargetのMSAAをオフにすると、この現象は消えます。つまり、MSAAのRenderTargetを開くと、MSAAがオンになっていないRenderTargetに影響し、しかもAndroidにのみ表示されます。GPUが異なれば、現象も異なります。**
 
>A：問題は解決しました。私が抱えている問題の終わりは、MSAAがオンになっているRenderTargetはMSAAがオンになっていないRenderTargetに影響を与えるということではありません。MSAAを有効にすると、メインカメラのRenderTexture（MSAA）がShaderにバインドされ、操作は次のようになります。

>```
texture(_Main_Tex, UV + Offset)
```
UnityのBugなのか、それとも他の理由なのかわかりませんが、Androidでは、ShaderにバインドされたRenderTextureは必ず有効なResolveAAを経るバージョンであってはならないため、上記の操作を行うと、小さな正方形やメッシュなどの異常な現象が発生します。オフセットが0の場合、異常なパフォーマンスは発生しません。これは、Mobile GPUのTBRに関連しているはずです。
次に、Androidで有効なResolveAAを経たRenderTextureを渡す必要があります。検証後、次の方法を使用して解決できます。

>```
RenderTexture.Blit(Rt_msaa, Rt_no_msaa);
```

このようにして、有効なResolveAAを持つRtを取得します。
 
##Rendering

**Q：ボディのパーツをマージするには、すべてのパーツでReadable / Writableプロパティが有効になっている必要があります。また、マージにより、マージする新しいメッシュも作成されます。複数のパーツを1つのメッシュにマージするメリットはありますか？**
 
**ゲームの種類はMMOARPGです。たとえば、髪の毛、顔、服などを変更できます。アセットの量が非常に多いです。マージしないと、ポイントをぶら下げてメッシュにマージする方法はどうなりますか。**
 
>A：問題１の利点は、バッチ処理の利便性です。前述の点に加えて、欠点はテクスチャのマージであり、これにより追加のメモリ消費が発生します。適用するかどうかは、特定のプロジェクトタイプによって異なります。
2番目の問題は、実際にDraw Callのメモリを変更することです。これは、プロジェクトのどの部分がボトルネックであるかによって異なります。また、マテリアルにも注意が必要です。各部のマテリアルが大きく異なる場合、バッチ処理はできません。
 
##NGUI

 
**Q：Unity Shaderが階層関係を判断するための唯一の基準は深度テストですか？ NGUIのShaderにZTest構成がなく、深度書き込みを閉じていることがわかります。レンダリングの順序に従って階層を制御する必要がありますか？つまり、sortOrder sortLayerName renderQ camera depthは、さまざまなコンポーネントがレンダリングパイプラインに入る順序をUnityが制御しているだけですか？**
 
>A：従来のレンダリングパイプラインでは、深度テストはFragment Shader（Early Zなどの最適化手法を考慮しない）の後に実行され、遮蔽されたピクセルをカリングするために使用されます。Draw Callが送信される順序とは関係ありません。
Unityエンジンには、レンダリングの順序、つまりDrawCallの送信順序を決定できる多くのパラメーターがあります。
まず、最優先なのはCameraです。エンジンでのレンダリングはCameraによって開始されます。Built-inパイプラインでは、CameraのDepth度は主に、Cameraが最初にレンダリングされるオブジェクトを決定するために使用されます。最も一般的な構造。たとえば、Depth = 0のカメラ描画シーンや、Depth = 1の別のカメラ描画UIなどです。ただし、URP内のカメラのCamera Stackも同様の構造であり、Cameraのレンダリング順序を制御するために使用されます。
次に、オブジェクトのレンダリング順序を決定するために使用されるRenderQueueがあります。たとえば、内蔵のOpaqueとTransparentなど、詳細についてはUnityのドキュメントを参照できます。この値は、オブジェクトが小さいほど、最初に描画されることを意味します。同じRenderQueueには、さまざまなタイプのオブジェクトのレンダリング順序に関する特定のルールがあります。たとえば、エンジンのデフォルトの順序付けルールでは、Opaqueなオブジェクトは通常、前面から背面にレンダリングされますが、Transparentなオブジェクトは、レンダリングの正確さを確保するために背面から前面にレンダリングする必要があります。
SortingLayerとOrderInLayerは主にUGUICanvasで使用され、UIのレンダリング順序に影響を与える可能性があります。
さらに、UIのShaderでZTestが構成されておらず、ZWriteがオフになっていることが質問で言及されています。これも正常です。何をオンにするか、何をオフにするかは、レンダリングされたオブジェクトのタイプによって異なります。UIの並べ替えは、通常、UIシステム内のいくつかのパラメーターによって決定されるため、深さに依存しません。一部の通常の透過オブジェクトもZWriteを閉じ、ZTestのみを残します。
 
##Editor

**Q：Unityにインストールされているアプリアイコンは、デバイスにインストールするとぼやけますが、設定に特別な注意はありますか？**
 
>A1：UnityのImport Settingsを確認してください。これはパッケージ内のアイコンファイルにも働きます。これらのアイコンのImport Settingsで圧縮を削除できます。

>A2：独自のアイコンの設定にも注意を払う必要があります。プロジェクトをエクスポートしているため、使用されるアイコンアセットは、実際にはAndroidバージョンと同じであり、複数の解像度バージョンがあります。

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