Version: 2022.2
言語: 日本語
色空間
リニアレンダリングを使ったガンマテクスチャ

リニアのワークフローとガンマのワークフロー

Unity エディターでは、リニアワークフローとガンマワークフローの両方が可能です。リニアワークフローは、色空間の切り替えを備えており、ガンマ色空間で作成された テクスチャ をリニア色空間で正しく精密にレンダリングできます。ガンマ色空間とリニア色空間の詳細については、リニアレンダリングの概要 のドキュメントを参照してください。

詳しい情報は、以下を参照してください。

テクスチャはガンマ色空間に保存される傾向がありますが、シェーダーはリニア色空間を前提としています。そのため、テクスチャがシェーダーでサンプリングされると、ガンマベースの値は不正確な結果となる原因になります。これを解決するために RGB サンプラーを使用するように Unity を設定し、ガンマサンプリングからリニアサンプリングへ切り替えることができます。これにより、正しい色空間でシェーダーの入力と出力がすべて揃ったリニアワークフローを行うことができ、正しい結果が得られます。

ガンマワークフローとリニアワークフローを指定するには、Edit > Project Settings の順に選択し、Player カテゴリを選択し、Other Settings に移動し、Rendering セクションを開き、好みに応じて Color SpaceLinearGamma に変更します。

色空間設定を表示する Player 設定
色空間設定を表示する Player 設定

ガンマ色空間ワークフロー

リニアワークフローではより精密なレンダリングができますが、ガンマワークフローが必要な場合もあります (例えば、プラットフォームの中には、ハードウェアがガンマ形式しかサポートしていないものもあります)。

To do this, set Color Space to Gamma in the Player settings (menu: Edit > Project Settings, then select the Player category). Unity uses the gamma color space for color calculations, and keeps imported textures in the gamma color space. Unity also makes sure shaders keep textures in gamma color space, calculate in gamma color space, and write to a framebuffer that doesn’t reapply gamma correction.

Texture Import Settings might show textures as being in linear format, because this avoids shaders recognising the textures as being in gamma color space and automatically removing the gamma correction.

Color Space: Gamma モードで sRGB サンプリングを回避するよう設定できます。これを行うには、テクスチャの Inspector ウインドウsRGB (Color Texture) チェックボックスを無効にします。

リニア色空間ワークフロー

リニア色空間を使用すると、ガンマ色空間よりも正確なレンダリングが可能です。

これを行うには、Player 設定(メニュー: Edit > Project Settings > Player カテゴリ)で Color SpaceLinear に設定します。

テクスチャがリニア色空間かガンマ色空間で作成されている場合は、リニア色空間を使用できます。リニア色空間シェーダープログラムへのガンマ色空間のテクスチャ入力は、ガンマ補正を削除してシェーダーに渡されます。

ノート: テクスチャインポート設定テクスチャプレビュー ウィンドウは、リニア色空間で作業している場合でも、ガンマブレンディングを使用してテクスチャを表示します。

リニアテクスチャ

  • Color SpaceLinear を選択すると、テクスチャがガンマ色空間を使用していると仮定されます。Unity はデフォルトで GPU の sRGB サンプラーを使用し、ガンマからリニアの色空間へ切り替えをします。テクスチャがリニア色空間で作成されている場合は、sRGB サンプリングを無効にする必要があります。詳細については、リニアテクスチャの使用 を参照してください。

ガンマテクスチャ

注意

色の場合、変換は暗示的に適用されます。なぜなら、Unity エディターが値を浮動小数点に変換してから GPU に定数として渡すためです。テクスチャをサンプリングすると、GPU はガンマ補正を自動的に削除し、その結果をリニア空間に変換します。

これらのデータはシェーダーに渡され、ライティング計算は通常のようにリニア空間で行われます。結果の値をフレームバッファに書き込むときは、直ちにガンマ補正されるか、後でガンマ補正するためにリニア空間に残されます。どちらになるかは現在のレンダリング設定に依存します。例えば、ハイダイナミックレンジ (HDR) では、レンダリングの結果はリニア空間に残され、後でガンマ補正されます。

リニア色空間とガンマ色空間の違い

リニアレンダリングを使用する場合、ライティング方程式への入力値はガンマ空間の入力値とは異なります。つまり、色空間によって結果が異なります。 たとえば、ライトが当たるサーフェスの応答曲線が異なり、イメージエフェクトの挙動が異なります。

ライトの減衰

距離による減衰と法線ベースの減衰は 2 つの点で異なります。

  • リニアモードでレンダリングする場合、ガンマ補正を加えるとライトの半径が大きく描画されます。

  • ライトのエッジがよりはっきりと描画されます。これにより、サーフェス上のライティング強度の減衰をより正確に表現します。

左: リニア空間の球へのライティング。右: ガンマ空間の球へのライティング。
左: リニア空間の球へのライティング。右: ガンマ空間の球へのライティング。

リニアでの強度応答

ガンマレンダリングを使用する場合、シェーダーに供給される色とテクスチャにはすでにガンマ補正が適用されています。シェーダーで使用する場合、高輝度の色は、リニアのライティングと比べると、あるべき状態より実際には明るくなります。つまり、リニアでない方法では、ライトの強度が増加すると、サーフェスがますます明るくなるということです。これは、多くの場所でライトが明るくなりすぎる原因となります。また、モデルやシーンに色あせた感じを与えます。リニアレンダリングを使用すると、サーフェスからの応答はライトの強度が増加してもリニアのまま残ります。これによって、より現実的なサーフェスシェーディングとより良いサーフェスの色応答が実現できます。

下の Infinite 3D Head Scan 画像では、人間の頭部モデルに異なる強度のライトを当て、リニアとガンマのライティングを比較しています。

Lee Perry-Smith の Infinite 3D Head Scan。クリエイティブ・コモンズ・ライセンス 3.0 (www.ir-ltd.net で入手可能)
Lee Perry-Smith の Infinite 3D Head Scan。クリエイティブ・コモンズ・ライセンス 3.0 (www.ir-ltd.net で入手可能)

リニアとガンマのブレンド

フレームバッファにブレンドする場合、ブレンドはフレームバッファの色空間で行われます。

ガンマ空間レンダリングを使用すると、リニアでない色が混ざり合います。これは、数学的に正しくない色のブレンドで、予期しない結果をもたらす可能性があります。ただし、一部のグラフィックスハードウェアではこれが唯一のブレンド方法です。

リニア空間レンダリングを使用すると、リニア色空間でブレンドが発生します。これは数学的に正しく、正確な結果が得られます。

下の画像は、異なるタイプのブレンドを示しています。

上: リニア色空間でのブレンディング。期待通りのブレンディング結果が得られます。<br/>下: ガンマ色空間でのブレンディング。彩度と輝度が強すぎるブレンドになります。
上: リニア色空間でのブレンディング。期待通りのブレンディング結果が得られます。
下: ガンマ色空間でのブレンディング。彩度と輝度が強すぎるブレンドになります。
色空間
リニアレンダリングを使ったガンマテクスチャ