リニア ライティングはシーンの全ての入力が線形のときにシーンを照らすプロセスを指します。通常テクスチャは事前にガンマが適用された状態で存在します。これはテクスチャがマテリアルの中でサンプリングされたときに非線形であることを意味します。もしこのテクスチャが通常のライティング計算式で使用されると,全ての入力が使用前に線形となっていることが前提となっているため計算式の結果が誤ったものとなります。
リニア ライティングとはシェーダの入力と出力の両方が正しい色空間にあればより正しいライティング結果が得られるプロセスを指します。
既存のレンダリング パイプラインでは全てのカラーおよびテクスチャはガンマ空間でサンプリングされます。すなわちガンマ補正はシェーダで使用される前に画像やカラーから取り除かれます。これによりシェーダの入力がガンマ空間でありライティング計算式はこれらの入力を線形空間と同様に取り扱い最終的に最終ピクセルにガンマ補正が行われません。この時間のほとんどは間違いの間違いで相殺するので許容可能にも思えます。しかし実際にはそうなりません。
もしリニア ライティングが有効化されるとシェーダ プログラムの入力はガンマ補正が取り除かれて提供されます。カラーの場合,この変換は線形空間にあれば明示的に行われます。テクスチャはハードウェアによるsRGB読み込みでサンプリングされ,ソース テクスチャはガンマ空間で提供され,グラフィックス ハードウェアのサンプリングのときに結果は自動的に変換されます。これらの入力は次にシェーダに提供され,ライティングは通常どおりに行われます。結果の値は次にフレーム バッファに書かれます。この値はガンマ補正されてフレーム バッファに書かれるか,線形空間に残されて後々のガンマ補正に使用されます。これはげんざいのレンダリング設定に依存します。
リニア ライティングを使用する時,ライティングの計算式はガンマ空間のものと異なります。これは光が表面に当たったときにUnity既存のパイプラインのものと異なる反応曲線を持つということです。
ある距離でのフォールオフおよび法線ベースのライティングは二つの変更ぎなされます。最初の変更は,線形モードでレンダリングするときで,追加で実行されるガンマ補正ひよりライト半径は大きく見えるようになります。二つ目の変更は,ライティング エッジが粗くなることです。これによりモデルの表面へのライティング強度のフォールオフを修正します。
ガンマ空間ライティングを使用するとき,シェーダに提供されるカラーおよびテクスチャはガンマ補正が適用されています。シェーダで使用されるとき高い輝度のカラーはリニア ライティングで求められるよりも明るくなります。ライト強度が増すにつれて,表面は非線形に明るくなるということです。これによって特定の場所で明る過ぎるライティングにつながり,モデルやシーンに洗い流された感じが出ます。リニア ライティングを使用するとき,ライト強度が増すにつれて表面からの反応は線形で維持されます。これはよりリアルな表面シェーディングおよび,表面でより優れたカラー反応につながります。
Lee Perry-SmithによるInfinite, 3D Head Scan はクリエイティブコモンズ継承3.0 非移植ライセンスです。次のリンクからアクセスできます: http://www.ir-ltd.net/
フレームバッファへのブレンディングを実行するときブレンディングはフレームバッファのカラー空間で行われます。ガンマレンダリングを使用するとき,非線形のカラーが一緒にブレンディングされます。これは間違っています。線形空間レンダリングを行なうときブレンディングは線形空間で行われることご正しく,これにより期待された結果が得られます。
線形ライティングによりレンダリング空間の見た目が変わります。もしリニアライティングのプロジェクトを作成すると,ガンマ ライティングに変更すると,まず間違いなくおかしく見えます。このためにリニア ライティングからガンマ ライティングに移行するとプロジェクトを更新して切り替える前と同じ良さを維持させるのに時間がかかるかもしれません。それを踏まえた上でUnityでリニア ライティングは比較的シンプルです。この機能はプロジェクト単位で実装されPlayer Settingsの Edit -> Project Settings -> Player -> Other Settings で公開されています。
リニア ライティングを使用するとき,すべてのライティングおよびテクスチャは線形化され,すなわちライトマッパーに渡された全ての値もまた修正が必要ということです。リニア ライティングとガンマ ライティング間で切り替えるか切り戻す場合,ライトマップを再度焼き直す必要ごあります。Unityライトマッピング インタフェースにより間違ったカラー空間にあるときに警告きてくれます。
リニア レンダリングは全てのプラットフォームではサポートされていません。この機能を現在サポートしているビルド ターゲットは:
これらのターゲットはリニア ライティングをサポートしますが,デバイスのグラフィックス ハードウェアがシーンを正しくレンダリング出来るとは限りません。希望するカラー空間およびアクティブでサポートされているカラー空間はQualitySettings.desiredColorSpace および QualitySettings.activeColorSpace で希望するカラー空間が線形であるかにより確認出来ますが,もしアクティブなカラー空間がガンマ空間である場合,プレイヤーはガンマ空間にfall backしています。これを使用して警告ボックスを表示してアプリケーションが正しく表示されないことを伝えるかプレイヤーを強制的に終了します。
HDRを使用していないとき,sRGB 読み込みおよび sRGB書き込みをサポートする特別なフレームバッファが使用されます(読み込みで非ガンマ化して,書き込み時にガンマ化)。つまりテクスチャと同様にフレームバッファの値はガンマ補正されるということです。このフレームバッファはブレンディングまたはテクスチャとして制約されている場合,値は使用される前にガンマが取り除かれます。これらが書き込まれるとき,書かれる値はせんけ空間からガンマ空間に変換されます。もし線形モードでレンダリングするとき,全てポストプロセス エフェクトはソースおよびターゲット バッファはsRGBの読み込みおよぼ書き込みが有効化され,ポスト プロセスおよび ポスト プロセス ブレンディングが線形モードで実行されます。
HDRを使用するとき,レンダリングは フローティング ポイント バッファになります。これらのバッファには十分な解像度があり,バッファがアクセスされたときにガンマ空間への/からの変換が不要です。つまり線形モードでレンダリングするとき使用するレンダリング ターゲットは線形空間にカラーを格納します。つまり全てのブレンディング およびポストプロセス エフェクトは線形空間で明示的に実行されるということです。もしバック バッファへの書き込みがされると,ガンマ補正が適用されます。
Unity GUI をレンダリングするときレンダリングを線形空間で行いません。つまりGUIテクスチャは読み込みの際にガンマを取り除くべきではありません。これは二つ通りの方法により実現出来ます。
もう一つ重要なことはRGB値が何か特定のことを意味するように生成されるルックアップ テクスチャおよびその他のテクスチャはsRGBサンプリングをバイパスすべきです。
これによりサンプリングされたテクスチャがグラフィックス ハードウェアにより使用される前にガンマが取り除かれます。これはマスクのようなその他のテクスチャの種類において,シェーダに渡される値が生成される値と正確に一致することが望ましい場合に便利です。