リニアレンダリング概要
リニアレンダリングを使ったガンマテクスチャ

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

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

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

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

To specify a gamma or linear workflow, go to Edit > Project Settings, then select the Player category, navigate to the Other Settings, open the Rendering section, and change the Color Space to Linear or Gamma, depending on your preference.

Player settings showing the Color Space setting
Player settings showing the Color Space setting

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

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

To do this, set Color Space to Gamma in the Player settings (menu: Edit > Project Settings, then select the Player category). With this option selected, the rendering pipeline uses all colors and textures in the gamma color space in which they are stored - textures do not have gamma correction removed from them when they are used in a Shader.

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

注意 たとえ値がガンマ空間のものであっても、Unity のすべてのシェーダー計算では、リニア空間の入力であるかのように処理されます。使用可能な最終結果を得るために、エディターはシェーダーの出力をフレームバッファに書き込むときに一致しない形式を処理するよう調整し、最終結果にガンマ補正を適用しません。

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

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

To do this, set Color Space to Linear in the Player settings (menu: Edit > Project Settings, then select the Player category).

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

リニアテクスチャ

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