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

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

The Unity Editor offers both linear and gamma workflows. The linear workflow has a color space crossover where Textures that were authored in gamma color space can be correctly and precisely rendered in linear color space. See documentation on Linear rendering overview for more information about gamma and linear color space.

詳しい情報は、以下のドキュメントを参照してください。

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

ガンマワークフローかリニアワークフローかを指定するには、 Edit > Project Settings > Player に移動し、 Player Settings を開きます。Other Settings > Rendering と移動し、Color SpaceLinear または Gamma を選択します。

Player Settings ウィンドウの Color Space 設定
Player Settings ウィンドウの Color Space 設定

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

While a linear workflow ensures more precise rendering, sometimes you may want a gamma workflow (for example, on some platforms the hardware only supports the gamma format - see Linear Supported Platforms below.)

これを行うには、Player Settings ウィンドウ ( Edit > Project Settings > Player) で、 Color SpaceGamma に設定します。このオプションを選択すると、レンダリングパイプラインは、保存されているガンマ色空間のすべての色とテクスチャを使用します。ガンマ補正のないテクスチャは、シェーダーで使用されるときに削除されます。

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

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

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

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

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