関連トピック
カメラ

リニアレンダリング

概要

リニアレンダリングは、すべての入力をリニアスペースにしてシーンをレンダリングするプロセスのことを指します。通常、テクスチャ画像は事前にガンマ補正が適用された状態になっています。これは、テクスチャがマテリアル中でサンプリングされる際、値が線形にならない事を意味します。もしこれらのテクスチャが通常のライティングやイメージエフェクトの計算で使用されると、ノンリニアスペースで計算されるために少し誤った計算結果をもたらします。

リニアレンダリングとはシェーダーの入力と出力の両方が正しい色空間にあればより正しいレンダリング結果が得られるプロセスのことを指します。

ガンマパイプライン

通常のガンマレンダリングパイプラインでは、すべてのカラーとテクスチャはガンマ空間としてサンプリングされます。つまり画像やカラーがシェーダー内で使用される際、それらからガンマ補正は取り除かれません。たとえこれらがガンマ空間の値だったとしても、すべてのシェーダーは入力された値がリニア空間にあるものとして計算します。加えて、シェーダーがメモリーに書き出す最終的なピクセルはガンマ補正されません。大抵、この2回の間違いが互いの影響を打ち消しあい問題ないかのように思えます。しかし実際にはそうはなりません。

リニアパイプライン

リニアレンダリングが有効化されると、ガンマ補正が取り除かれたものがシェーダープログラムへ入力されるようになります。リニア空間を使っている場合、色情報にはこの変換が自動的に行われます。テクスチャはハードウェアによる sRGB の読み込みを使ってサンプリングされます ; ソーステクスチャはガンマ空間で提供されますが、グラフィックスハードウェアでサンプリングされる時に自動的に変換されます。これらの入力値は次にシェーダーに渡され、通常どおりにライティングが行われます。結果の値がフレームバッファに書込まれる際、現在のレンダリング設定によって、ガンマ補正されるか、後でガンマ補正するためにリニア空間のままになるかが決まります。

リニアとガンマレンダリングの違い

リニアレンダリングを使用すると、シェーダーの計算式に入力される値が、ガンマ空間の時とは異なります。これは、光がサーフェイスに当たったときの反応曲線とイメージエフェクトが、ガンマ空間のパイプラインの時とは異なる挙動になるという事です。

ライトフォールオフ

距離と法線ベースのライティングによるフォールオフには、2通りの変化がおきます。最初の変化は、リニアモードでレンダリングするときで、追加で実行されるガンマ補正によりライト半径が大きくなったように見えます。二つ目の変化は、ライティングエッジがきつくなることです。これは、ライティング強度によるモデル表面へのフォールオフを、より正しくします。

リニア強度反応

ガンマ空間レンダリングを使用するとき、シェーダーに提供されるカラーおよびテクスチャはガンマ補正が適用されています。シェーダーで使用されるとき高い輝度のカラーはリニアレンダリングで求められるよりも明るくなります。ライト強度が増すにつれて、表面は非リニアに明るくなるということです。これによって特定の場所で明る過ぎるライティングにつながり、モデルやシーンに洗い流された感じが出ます。リニアレンダリングを使用するとき、ライト強度が増すにつれて表面からの反応はリニアで維持されます。これはよりリアルな表面シェーディングおよび、表面でより優れたカラー反応につながります。

Lee Perry-Smith による Infinite、3D Head Scan はクリエイティブコモンズ継承 3.0 非移植ライセンスです。次のリンクからアクセスできます: http://www.ir-ltd.net/

リニアおよびガンマブレンディング

フレームバッファへのブレンディングを実行するときブレンディングはフレームバッファのカラー空間で行われます。ガンマレンダリングを使用するとき、非リニアのカラーが一緒にブレンディングされます。これは正しくありません。リニア空間レンダリングを行なうときブレンディングはリニア空間で行われることが正しく、これにより期待された結果が得られます。

リニアレンダリングの使用

リニアでシーンをレンダリングすると、レンダリング結果がそれまでとは異なって見えます。ガンマ空間でレンダリングするように用意したプロジェクトをリニアレンダリングに変更すると、最初はまず間違いなくおかしくなったように見えるでしょう。そのため、ガンマレンダリングからリニアレンダリングに移行すると、プロジェクトを以前と同じような好ましい見た目に修正するのに、少し時間がかかるかもしれません。しかし、リニアレンダリングへの移行は、最終的にはより一貫性のある、リアルなレンダリングを可能にします。そうは言っても、Unity でリニアレンダリングに変更する手順は、比較的簡単です。この機能はプロジェクト単位で実装され Player Settings の Edit -> Project Settings -> Player -> Other Settings で操作できます。

ライトマッピング

リニアレンダリングを使用すると、すべてのライティングおよびテクスチャはリニア化されます。これはつまり、ライトマッパーに渡されたすべての値にも修正が必要になる、という事であり、したがってリニアライティングとガンマライティングを切り替える場合、その都度ライトマップを焼き直す必要があります。これは自動ベイクの設定(デフォルト)である場合は自動的に行われます。

サポートされるプラットフォーム

リニアレンダリングはすべてのプラットフォームではサポートされていません。この機能を現在サポートしているビルドターゲットは:

  • Windows、Mac、Linux (スタンドアロン)
  • Xbox 360、Xbox One
  • PlayStation 4

これらはリニアレンダリングをサポートしますが、デバイスのグラフィックスハードウェアがシーンを正しくレンダリングできるとは限りません。これを確認するには、QualitySettings.desiredColorSpace と__QualitySettings.activeColorSpace__ を検証します。希望する色空間がリニアであるにもかかわらず、アクティブな色空間がガンマである場合は、プレイヤーはガンマ空間にフォールバックします。これによって、アプリケーションが正しく表示されない可能性やプレイヤーが強制終了する可能性が、ユーザーに分かる場合があります。

リニアおよび非 HDR

HDR を使用していないとき、sRGB 読み込みおよび sRGB 書き込みをサポートする特別なフレームバッファが使用されます(読み込みで非ガンマ化して、書き込み時にガンマ化)。つまりテクスチャと同様にフレームバッファの値はガンマ補正されるということです。このフレームバッファはブレンディングまたはテクスチャとして制約されている場合、値は使用される前にガンマが取り除かれます。これらが書き込まれるとき、書かれる値は線形空間からガンマ空間に変換されます。もしリニアモードでレンダリングするとき、すべてポストプロセスエフェクトはソースおよびターゲットバッファは sRGB の読み込みおよび書き込みが有効化され、ポストプロセスおよびポストプロセスブレンディングがリニアモードで実行されます。

リニアおよび HDR

HDR を使用するとき、レンダリングはフローティングポイントバッファになります。これらのバッファには十分な解像度があり、バッファがアクセスされたときにガンマ空間への/からの変換が不要です。つまりリニアモードでレンダリングするとき使用するレンダリングターゲットはリニア空間にカラーを格納します。つまりすべてのブレンディングおよびポストプロセスエフェクトはリニア空間で明示的に実行されるということです。もしバックバッファへの書き込みがされると、ガンマ補正が適用されます。

旧 GUI とリニアで生成されたテクスチャ

Immediate Mode GUI (IMGUI)の各要素は、常にガンマ空間でレンダリングされます。つまり、旧 GUI システムで使用する GUI テクスチャは、読み込み時にガンマを取り除くべきではないという事です。これには、2通りの対処方法があります。

  • Texture Importer でテクスチャの種類( texture type )を GUI にセットします。
  • Texture Importer の設定を advanced にし、「Bypass sRGB Sampling」のチェックボックスを有効にします。

RGB 値が特定の意味合いを持っていてガンマ補正がかかっていない、ルックアップテクスチャ、マスク類、その他テクスチャでは、sRGB でのサンプリングを迂回するべきです。これが、シェーダーで使われる前に、ガンマ補正を取り除かずにテクスチャをサンプリングする理由であり、その計算結果は保存されている値から変化しません。

関連トピック
カメラ