sRGBのテクスチャチェックに関する疑問

1）sRGBのテクスチャチェックに関する疑問

2）ライティングをオンにすると、メッシュ数が増える

3）UGUI Imageの材質属性を修正する質問

4）UniWebViewインターフェイスがUnityインターフェイスの後に表示されるのはどすればよいのか

5）TimelineのInternal_CreatePlayableはコストが高い

 ---


Rendering
---
**Q：UWAある回答を見つけました（中国語注意）：**

https://answer.uwa4d.com/question/5bd1724fae74300ab0497bed

**結論は次のとおりです。**

>**linear space + gamma texture、sRGBを選択します**
>**linear space + no gamma texture、sRGBを選択しません**

**Gamma Spaceでは、sRGBを選択することは何の影響もないようですが。**

 

**Player Settingのcolor space設定標識によってインポートされた画像が、Gamma Spaceで作成されたのかLinear Spaceで作成されたのかについて、ドキュメントでは明確ではありません。もう少し説明してくれませんか。**

 

**ここでのディスカッションによると：https://forum.unity.com/threads/confusion-about-gamma-vs-linear.496053、sRGBが選択されている場合、Unityはgamma逆補正を行います。つまり、tex2Dからのvalueはbe pow（origin_color_value、2.2）、ここでgamma値は2.2と想定され、fragではRチャネルの値が逆補正され、heatmapのuの中央値は約0.5になります。それなら、上記のディスカッションで最初のheatmapが示したようになりますが、実際には2番目のheatmapのように示しています。**

 

**colorの代わりにcolorの値をdataとして使っているからだと言われていますが、やはり納得できません。dataでもcolorでもすべて数字であり、数字の比較には間違いがありませんから。**
 

>A1：確かにGamma Spaceでは、sRGBを選択することは何の影響もないようですが。
>
>Linear Spaceで、sRGBが選択されている場合、UnityはRemove Gamma Correctionをします。この場合、図の値は0.5階調値、つまりu = 0.5の列の階調値です。次の図に示すように、Remove Gamma Correctionすると、取得される値は0.25になります。
>![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ddd681a9-cffa-01f2-3a50-9c191f0e1ef6.png)
X軸は光の強度を表し、Y軸はグレー値を表します。
青い線のY値は、人間の目の階調、視覚的な階調値を表します。赤い線は、光の強度に比例する物理的な空間の実際の階調値を表します。
Photoのグラデーション図でu=0.5の列の階調値は0.5で、これは視覚的な階調値です。Remove Gamma Correctionの後、実際の階調値は0.25になります。Fragment Shaderの計算に参加します。したがって、2番目のheat mapが表示されます。

 

>A2：この記事を参照できます：https://developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-24-importance-being-linear
個人的な理解です。通常の状況では、私たちが見る画像は「モニタースペース」にあり、画像自体がGammaCorrectionをした（つまり、元の値は 1 /2.2乗の操作をしました。）ため、モニターに表示される画像の色は正常です。このような画像の場合、非線形として理解できます。 Unityが線形空間を選択した後、そのような非線形画像の場合、正しくレンダリングするにはsRGBを選択する必要があります。画像のsRGBが選択されると、メモリ内の形式は、以下に示すように、ETC2_EAC_RGBA8_SRGBの形式になります（画像がETC2 8ビットの圧縮形式を選択すると仮定します）。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/66385ec7-8877-6d84-95ed-ca28fcd7d72e.png)
sRGBが選択されていない場合、以下に示すように、ETC2_RGB8_UNORM形式になります。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/fed086f9-1923-ee21-52aa-95059c24734c.png)
この_SRGBサフィックス形式の場合、GPUがテクスチャサンプリングを実行すると、GamaCorrectionが自動的に削除されます。つまり、値は2.2乗をしますが、元のデータは変更されません。Gamma空間では、sRGBが選択されているかどうかに関係なく、形式はETC2_RGB8_UNORMです。
問題主の質問について、Gamma空間では、レンダリングの結果は平均的な4色になります。これは、Gamma空間ではGammaCorrectionが削除されないためです。つまり、この「非線形画像」はu= 0.5の場合（uはテクスチャuv座標）、テクスチャのdata値= 0.5、Linear空間になるとdataは変化しません。相変わらずu = 0.5の場合に、data= 0.5になります。しかし、sRGBを選択した後、テクスチャサンプリングを実行する場合、GPUは値に対して2.2乗の操作をし、約0.25になります。したがって、u <= 0.5の場合、color.r <= 0.25になります。Shader がcolor.r <0.25を計算すると、赤になります。つまりu <= 0. 5の場合、すべて赤なので、色の半分が赤です。

 
---

Rendering
---
**Q：Unityによって表示される面（メッシュ）数は、このフレームでGPUにアップロードされたすべての頂点データによって決定されるため、GPUがこの部分をキャッシュしないのはなぜですか。ライティングをオンにすると、面数が増えるため、モデルの頂点データを複数回アップロードすることになります。この部分をキャッシュすると、パフォーマンスが大幅に向上しませんか。GPUがこのキャッシュを実行できない場合、GPUのキャッシュが小さすぎてそのようなスペースがないことを意味しますか、それともGPUがキャッシュする部分を確認できないことを意味しますか。エンジンコードを変更すると、プロジェクト用にキャッシュできます。**

 

>A：ライト自体のシェーディングは、DrawCallと面数には影響しません。リアルタイムシャドウは、シャドウ用の深度マップをレンダリングする必要があります。これは、別の視点からレンダリングするのと同じであり、データは現在のカメラとは異なります。 FrameDebuggerを開いて、レンダリングプロセス全体を確認できます。

 
---

UGUI
--- 

**Q：UGUIのImageはMaterialPropertyBlockを設定することでマテリアルプロパティを変更できますか。設定方法はありますか。**

 

>A：UGUIはマテリアルブロックを使用しません。以下を参照してください。

https://forum.unity.com/threads/big-problem-with-locking-materialpropertyblock-for-ui-image.506941

 

UGUI
 

Q：Android側にWebページを表示するプラグインUniWebViewがあります。デフォルトでは、Unityインターフェースの上位層に表示され、Unityのすべての表示をブロックします。 Androidのネイティブインターフェイスをバックグラウンドにし、UnityのUIをフォアグラウンドにし、Unityのバックグラウンド自体を透明にする方法を教えてください。

 

>A：UniWebViewをUnityインターフェイスの背後で実行できるようにするために、公式ドキュメントにはダメだと記載されています。
https://docs.uniwebview.com/guide/faq.html
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/726eca9a-365a-e073-fd34-aaa00687be43.png)
Unityの背景の透明度の維持に関しては、Player Settingsに以下のようなオプションがあります。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c521e894-951c-ecd8-74a3-938c81db89fb.png)



--- 

Playable
---
**Q：特殊効果はTimelineを使用して作成されています。最近のパフォーマンステストで、Internal_CreatePlayableメソッドには多くのコストがあることがわかりましたが、トラックが1つしかないなのに、このコストが何に関連していますか？**
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/08beef6e-fd8a-b715-0f0d-272b325a57b7.png)

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a80ea5e2-9d3f-b952-3b6d-871fc6ca1c85.png)

**同じオブジェクトをPCにロードし、Internal_CreatePlayableに18.55ミリ秒かかり、次にPCにCubeを作成してTimeline効果を追加してから、Internal_CreatePlayableに約4ミリ秒かかるようになります。**

 

>A：Timlineの最初のCreatePlayableは時間がかかります。こちらの簡単なTimelineアセットでも、初めて500ミリ秒以上かかります。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/97fa35c1-56a5-ded8-a00c-d3864ba0ca00.png)
ただし、シーンのロードにCreatePlayableステップを配置することで、ゲーム中のラグを回避できます。Timelineアセットを読み込んだ後、PlayableDirector.RebuildGraphを呼び出すと、Prewarmと同等のCreatePlayableが実行されます。その後、Play（）を呼び出しても、CreatePlayableは実行されません。RebuildGraphを呼び出しても、キャッシュがあるため、高い時間コストも発生しません。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7f22658c-db4f-24dd-a104-95ff71d72088.png)
次の図は、RebuildGraphを初めて呼び出すのにかかる時間を示しています。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/665e7d03-1f44-7631-d943-918e51bd5704.png)
次の図は、RebuildGraphを2回呼び出すのにかかる時間を示しています。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/1186bb05-4cc8-3e9c-e880-37e46ecbacf2.png)

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