Amazonで商品を見るセール会場へ

UnityのLinearとGammaの違い:Color Space・sRGB・明るさの確認手順

Unityの色や明るさを調べるときは、プロジェクトのColor Space、画像のsRGB設定、Shader、表示時の露出・トーンマッピングを分けて確認します。ライトのIntensityへ一律に逆ガンマの計算を入れる手順ではありません。まず同じUnityシーン内で条件を固定し、その後にMayaなど別のアプリケーションと比較してください。

現行仕様の参照はUnity 6.3 LTSです。下部のUnity/Maya画像と計算は元記事の旧比較資料として残しています。今回UnityやMayaを実行して色、輝度、画像を測定した結果ではなく、現在の版で同じ数値になることを保証しません。

目次

LinearとGamma:どこで変換されるか

項目・症状設定・確認先
Linearのレンダリング色を線形の値へ変換して照明などを計算し、表示用の変換を行う方式。色TextureとデータTextureの区別が必要。
Gammaのレンダリングガンマ空間の値を使う方式。単にLinearより暗い/明るいと決めず、対象Shaderや処理条件を合わせて比べる。
sRGB(Color Texture)色として描いたRGB画像をサンプリング時に変換するためのImport設定。マスクのような数値データには同じ指定を使わない。
HDR・露出・トーンマッピング計算結果から表示へ至る別の条件。Color Spaceだけ合わせても、異なる露出やView Transformでは同じ見た目にならない。

Unity公式のColor Space設定と線形データTextureの説明を基準に確認します。sRGBは単純なべき乗だけで表される曲線ではありません。2.2を使う式は近似の説明とし、すべての変換処理へ同じ式を手動で加えないようにします。

Unityで比較条件をそろえる手順

  1. プロジェクトを複製またはバックアップし、Editorの版、Built-in/URP/HDRP、使うShader、Color Spaceを記録します。パイプラインが対応するColor Spaceをその版の資料で確認します。対応していない組み合わせを無理に切り替えません。
  2. Unity 6.3ではEdit → Project Settings → Player → Other Settings → RenderingのColor Spaceを確認します。対象プラットフォームの設定を確認し、まずLinearでの比較条件を作ります。
  3. 色Textureを使うMaterialと、同じ形状のUnlitの比較対象を用意します。Litの照明結果とUnlitの色を同じものとして比較せず、それぞれの目的を分けます。
  4. CameraのHDR、露出、トーンマッピング、ポストプロセス、環境光、ライト、Materialの色とTextureを記録します。比較用シーンでは不要な効果を外すなど、条件を固定します。
  5. 同じCamera、背景、距離で表示を確認します。設定を一つずつ変え、変えた項目と結果を保存します。Gammaとの比較は、選んだパイプラインが対応する場合に別の複製で行います。

「Gammaが常に初期設定」とは扱いません。テンプレートやパイプラインが違えば前提も変わるため、現在開いているプロジェクトの設定を確認してください。

画像が暗い・明るい:sRGBを確認する

項目・症状設定・確認先
色として表示する画像TextureのsRGB(Color Texture)を確認。Linearでは色を計算用へ変換することを前提にする。
白黒マスク・数値データ色変換を必要としない数値ならsRGBを外す。見た目が白黒という理由だけで決めず、Shaderで何の値に使うかを確認。
RenderTextureを経由するRenderTextureのフォーマット、sRGB/線形の扱い、書き込み側と読み込み側を確認。カメラ出力とRawImageの見た目だけで変換回数を判断しない。
自作Shaderだけ色が違うColor/Float/Vectorのプロパティ型と手動変換を確認。Textureの変換とShader内の追加変換が重なっていないか調べる。

MaterialプロパティをShaderへ渡す仕様では、LinearのColorプロパティに色変換があります。通常のFloat/Vectorと同じ扱いではなく、[Gamma]属性も区別します。C#のColor.linearも変換を行うため、既に線形の値を再び変換しないようにします。RenderTexture.sRGBの仕様も参照してください。

ライトのIntensityを手動でガンマ変換しない

Light.intensityの公式説明は、強度がライトの色に掛けられる値であると説明しています。Intensity 4を必ず4^(1/2.2)へ直す、という一般的な設定指示ではありません。Intensity、Materialの色、最終画像のピクセル値は役割の違う値です。

別のアプリケーションと合わせる場合は、ライトの種類・単位、距離、減衰、Material、色変換、露出、View Transformをそろえる必要があります。旧画像の一点が近いことだけでは、現在のMayaとUnityの照明全体が一致する根拠にはなりません。

旧Unity/Mayaの比較資料と計算

ここからは元記事の画像と式です。使用版・描画条件を今回再現していないため、設定値をそのまま現行プロジェクトへ入力する手順ではありません。最初の画像は当時の比較で、今回取得した検証画像ではありません。

リニアワークフローの基本と設定方法を解説する記事の導入イメージ。

旧説明ではライト強度4を次の近似式へ代入していました。これは元資料にある計算であり、現行のIntensity設定へ必要な変換として推奨しません。

4^(1/2.2) = 1.878

旧Linear側のMaterial色に関する画像と、0.1を2.2で近似する式です。Color Pickerの表示、Shaderへ渡る値、8bitの画像値を区別して読んでください。

ディフューズの計算式に基づいてメインカラーに数値を入力する設定画面の様子。
(0.1^(1/2.2)) × 255 = 89.5

次のMaya画像と式は、旧資料で強度とDiffuseの積から表示値を見積もったものです。「168/255」はこの旧比較の値で、今回のUnity 6.3で測った結果ではありません。

レンダリングを実行しカラーマネージド画像として保存した出力結果。
(強度 × ディフューズ)^(1/2.2)
(4 × 0.1)^(1/2.2) = 0.66 (168/255)

旧Gamma側の画像には、強度4と表示値を逆算した別のMaterial値が示されています。LinearとGammaで同じ入力値を使っている比較ではない点に注意してください。

ガンマ設定時に一番明るい場所の出力を合わせるためメインカラーに数値を入力する様子。
((168/255) / 4) × 255 = 42

旧Maya画面ではGamma Rendering Spaceの設定を変えた比較が掲載されていました。現在のMayaの操作やView Transformを検証した説明ではありません。

マテリアルのカラー設定を行いレンダリングスペースのチェックを外した設定画面の様子。
(168/255) / 4 = 0.164

最後の比較画像も元資料です。旧式の近似と現行のsRGB変換・HDR表示を混ぜず、現在の対象版で条件を記録して比較してください。

リニアとガンマの各カラースペースにおける光の強さやマテリアルカラー、最終出力の比較。

色が合わないときの確認順

  1. まずColor Spaceと対象パイプラインを確認します。
  2. 次に色TextureかデータTextureか、sRGBの指定とShaderの読み方を確認します。
  3. MaterialのColor/Float/Vector、Color.linearなど追加変換を確認します。
  4. Litならライトと環境光、Unlitなら照明以外の表示条件を調べます。
  5. 最後にHDR、露出、トーンマッピング、RenderTexture経由の変換、他アプリのView Transformを確認します。

完了の目安は、使用版と設定を記録し、どの変更で差が生じるかを一つずつ説明できることです。特定の8bit値が出たことだけを成功条件にしません。Shaderの演出やUI側の色の扱いは関連する記事で確認してください。

環境設定の記事は、ほかにもあります。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

Unityのおすすめ書籍

開発PCの選び方

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次