7 | Linear Spaceワークフロー

## Gamma SpaceとLinear Space
Gamma Correctionが存在するため、レンダリングでの計算に少し問題があります。たとえば、sRGB画像の非線形入力があり、操作が線形空間で実行されると、最終的な出力結果が目的の結果から外れます。

 

実世界の物理法則は線形空間で計算されるため、Shaderでの計算も線形空間で計算されます。たとえば、前の曲線によると、実際の物理的な空間の光の強度が0.2ですが、人間の目はそれを0.5の明るさとして認識します。0.2に従って計算することと0.5に従って計算することによって得られる結果は、当然異なります。


![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7a4ea167-04b6-efb6-9f14-e5a615d357e8.png)

7.1Unityエンジンのさまざまなスペースの照明表示

したがって、現実の世界の色をより現実的かつ正確に復元するために、より良い制作プロセスは、入力、計算、および出力を線形空間に統合させることです。次にGamma Correctionが実行され、最後にディスプレイに表示されます。

まず、入力データが線形空間に配置されていることを確認する必要があります。sRGBテクスチャの場合、Remove Gamma Correction（2.2の累乗の操作を実行）を実行してLinear Spaceに戻す必要があります。

次に、Shaderを介して計算を実行します。この部分の計算は線形空間にあります。

次に、結果に対してGamma Correctionが実行され、最終的にディスプレイから出力されます。これにより、現実の世界に近い結果が得られます。

 

グレースケール値1を例として取り上げます。Shader計算後の出力結果が入力結果の0.9倍であると仮定します。
![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/34846ba6-a566-1b69-ac68-5221268c5d54.png)




Linear Spaceにある場合は、[Remove Gamma Correction] 後の値が1になり、Shaderで計算して値を1 * 0.9 = 0.9とし、Gamma Correctionを実行して0.9 ^ 0.45 = 0.95になり、最後にディスプレイに表示されます：0.95 ^ 2.2=0.89。

Gamma Spaceの下にある場合、Shaderで計算された値は1 * 0.9 = 0.9であり、ディスプレイに表示されます：0.9 ^ 2.2=0.79。

Gamma Spaceでのレンダリング結果が暗いことがわかります。Linear Spaceでのレンダリング結果は少し明るくなります。図7.1の結果に示されているように。

 

## Unityの場合
Linear SpaceとGamma Spaceの選択は、Project Settings->Player ->Color Spaceにあります。
![image11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/703744be-cd91-e4f5-d984-5aca90eda40c.png)



ガンマスペースが選択されている場合：

Unityは入力と出力結果に対して何の処理も行いません。図7.2に示すようなRemove Gamma CorrectionとGamma Correctionは発生しません。必要に応じて、手動で実装する必要があります。

 

Linear Spaceが選択されている場合：

sRGBテクスチャの場合、Unityはテクスチャサンプリングの前に自動的にRemove Gamma Correctionを実行します。Linearテクスチャにはそのようなステップはありません。出力する前に、Unityは自動的にGamma Correctionを実行してからディスプレイに出力します。

 

したがって、テクスチャの場合、Unityにテクスチャのタイプと色空間を教える必要があります。
![image12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/992f3a29-2de1-50f6-792d-e646b0564048.png)

![image13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7a408465-2b0e-a919-cceb-c29b846541a0.png)




いくつかの特別なテクスチャタイプは、Normal Map、Light Mapなど、デフォルトでLinear Spaceで行います。

Defaultタイプのテクスチャには、sRGBオプションがあります。チェックされている場合は、ガンマ0.45空間にあることを意味し、チェックされていない場合は、Linear Spaceにあることを意味します。

 

さらに、Linear Spaceでは、Shader Labでの色入力はデフォルトでsRGB色になり、Remove Gamma Correctionが自動的に実行されます。頂点カラー属性データについては、手動でRemove Gamma Correction処理を実行する必要があります。

 

場合によっては、Float変数でRemove Gamma Correctionもする必要があります。その時、ShaderLabで[Gamma]プレフィックスを使用する必要があります。

 

モバイルサポート：Androidでは、LinearはOpenGL ES 3.0およびAndroid4.3以降でのみサポートされ、iOSではMetalのみがサポートされます。ハードウェアデバイスの開発に伴い、より現実的な効果を追求するために、ますます多くのプロジェクトがLinear Spaceの下で作業することを選択しています

 

## Unrealの場合

![image14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/9b4f9810-e13a-76a6-e663-02e6cb623301.png)

（Unrealデフォルトの照明表示）

Unrealの場合、原理は同じです。

関連するTextureのDetailsページにsRGBオプションがあります。

![image15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a1777439-6fe0-7d08-899c-7971492a99e9.png)


Unityと同様に、画像のストレージカラースペースを表します。

同様に、画像サンプリングを実行するときは、対応するサンプリングタイプを選択する必要があります。

Colorタイプ。サンプラーがsRGB色空間で画像をサンプリングすることを示します。
![image16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/bcad0fd5-64f2-5218-65e5-70362cd6fbcf.png)

Linear Colorタイプ。サンプラーがLinear Spaceで画像をサンプリングすることを示します。



異なる色空間では、効果が異なります（平行光が追加されます）。
![image17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/d3c0b8d8-f4f3-53b2-2347-63b8e70c0fd0.png)

 

sRGBがチェックされていない場合、つまりこの画像がLinear Spaceの画像として扱われている場合、結果はより明るくなることがわかります。 Unityと比較すると、Unrealの設定はより便利であり、Unrealは色入力に対応するスペースを設定することもできます。
![image18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/658ee750-e0b7-b455-8661-e5aac9741374.png)



## まとめ
今日、レンダリングの要件がますます高まっており、よりリアリズムのある物理ベースのレンダリング（PBR）の出現により、より正確な計算結果を得るために、Linear Spaceでのレンダリング計算が徐々に多くのチームに採用されています。 UnityとUnrealの2つの主要なエンジンもLinear Spaceワークフローをサポートしています。開発者は、Linearワークフローを理解し、データの入力、計算、および出力をどのように変更する必要があるかを理解する必要があります。この方法でのみ、データ計算の精度を保証できます。

関連する知識については、以下をお読みください。

「HDRと色彩管理」
[【HDRと色彩管理1】光、色、色度図](https://qiita.com/UWATechnology/items/6152dd166ff5dd2474eb)
[【HDRと色彩管理2】色空間](https://qiita.com/UWATechnology/items/852a7c87620a36d5a8c7)
[【HDRと色彩管理3】SDRとHDR](https://qiita.com/UWATechnology/items/ab42149a9d6438b36043)
[【HDRと色彩管理4】HDR標準とACES](https://qiita.com/UWATechnology/items/2a40dbc66bf48041d405)
[【HDRと色彩管理5】ゲームにおけるHDR](https://qiita.com/UWATechnology/items/3e661ccd85b661ae5042)

実際のプロジェクトでは、Gamma SpaceとLinear Spaceの開発経験について、次の記事を参考してください。

「ガンマから線形色空間へのUnityプロジェクトの経験共有」(中国語注意）

https://edu.uwa4d.com/course-intro/0/116?purchased=true


推奨：

「UnityのGamma Correctionと線形ワークフローについて話す」(中国語注意）

https://www.jianshu.com/p/e15932c40bea

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