API
HDR カラーピッカー

Unity で HDR レンダリング

通常のレンダリングでは、ピクセルの赤、緑、青は 0 から 1 の範囲の小数点数により表現され、0 は強度 0 であり、1 はディスプレイデバイスの最大の強度を意味します。これを使用するのは簡単ですが、現実世界の場面でのライティングの働きを正確に反映しません。人間の目は、近隣のライティング条件に合わせようとするため、もし暗く照らされた部屋で白く見えるものでも、昼間の明るい光で灰色に見えるものほどに実際は明るくない場面があります。さらに目はレンジの低いほうが高い方よりも明るさの差に敏感です。

ピクセル値の範囲が現実世界のライトレベルをより正確に反映するようにレンダリングを適合させると、より説得力のあるビジュアルエフェクトを得られるようになります。値をディスプレイデバイスで利用可能な範囲にマッピングしなおす必要はありますが、中間的な演算( Unity のイメージエフェクトのような)では、よりリアルな結果が得られるようになります。グラフィックスの内部表現で 0 ~ 1 範囲外の値を使えるようにすることは High Dynamic Range (HDR) レンダリングの根本的な要素です。

HDR での作業

HDR はカメラコンポーネントの設定を使用して各カメラで別々に有効化します。

HDR を有効にすると、シーンは 0 ~ 1 範囲を超えるピクセル値を格納可能な HDR イメージバッファにレンダリングされます。このバッファは次に ブルーム などのイメージエフェクトを使用してポストプロセッシングされます。 トーンマッピング イメージエフェクトにより、 HDR 画像は標準的な low dynamic range (LDR) 画像に変換され、ディスプレイへ送られます。LDR への変換は、イメージエフェクトパイプラインのどこかの時点で適用する必要がありますが、LDR のみに適用できるイメージエフェクトを後から使う場合は、最終ステップである必要はありません。利便性のため、いくつかのイメージエフェクトは HDR エフェクトを適用した後に自動的に LDR に変換されます(以下のスクリプトを参照してください)。

トーンマッピング

トーンマッピングは HDR の値を LDR の範囲に戻すマッピング処理です。様々な技法があり、あるプロジェクトでベストだった方法が、他でもベストであるとは限りません。 Unity にはトーンマッピングのイメージエフェクトが複数用意されています。それらを使用するには Assets > Import Package > Effects を選び、シーンのカメラを選択して Component > Image Effects >ToneMapping を選択します。トーンマッピングの種類についての詳細な説明は image effects documentation にあります。

極めて明るいシーンを HDR でレンダリング。トーンマッピングなしではほとんどのピクセルは範囲外。
極めて明るいシーンを HDR でレンダリング。トーンマッピングなしではほとんどのピクセルは範囲外。
前述と同じシーン。ただし、トーンマッピングエフェクトによりほとんどの強度を満足できる範囲に移動しています。Adaptive であるトーンマッピングによりこれを超えてブレンドすることさえできて、この画像はキャプチャリングメディアの Adaptive 特性をシミュレートします(目、カメラ)。
前述と同じシーン。ただし、トーンマッピングエフェクトによりほとんどの強度を満足できる範囲に移動しています。Adaptive であるトーンマッピングによりこれを超えてブレンドすることさえできて、この画像はキャプチャリングメディアの Adaptive 特性をシミュレートします(目、カメラ)。

HDR ブルームおよびグロー

HDR を使う事によって、ポストプロセッシングがより調整しやすくなります。 LDR のブルームには、ピクセル強度が 1.0 より小さい部分を含むシーンの広い範囲にブラーがかかってしまう、という残念な副作用があります。 HDR を使用することで、強度が 1 より大きいエリアだけをブルームすることができます。これによって、シーンの非常に明るい要素だけが隣接するピクセルに染み出し、より適切な結果になります。 Unity の ‘Bloom and Lens Flares’ イメージエフェクトは HDR もサポートするようになりました。カメラにアタッチするには Assets > Import Package > Effects を選択し、シーンのカメラを選んで Component > Image Effects > Bloom を選択します。‘ブルーム’ エフェクトの詳細な説明は image effects documentation にあります。

車のウィンドウの太陽の反射は 1.0 より遥かに大きい強度の値です。カメラが HDR を有効にしていればこの強度がキャプチャできるので、ブルームでこの部分だけを検知してグローさせることができます。
車のウィンドウの太陽の反射は 1.0 より遥かに大きい強度の値です。カメラが HDR を有効にしていればこの強度がキャプチャできるので、ブルームでこの部分だけを検知してグローさせることができます。
HDR を有効にしない場合、車のウィンドウはグローなしで残ります。グローを追加する唯一の方法は強度の閾値を下げることですが、そうすると画像の意図しない場所もグローするようになってしまいます。
HDR を有効にしない場合、車のウィンドウはグローなしで残ります。グローを追加する唯一の方法は強度の閾値を下げることですが、そうすると画像の意図しない場所もグローするようになってしまいます。

HDR の長所

  • カラーが高い強度のエリアで失われない
  • ブルームおよびグローの優れたサポート
  • 低い周波数のエリアでのバンディングの削減

HDR の短所

  • 浮動小数点数レンダーテクスチャを使用(レンダリングが遅くなり、より多くの VRAM を必要とします)
  • ハードウェアアンチエイリアスはサポートされていない(ただし アンチエイリアス を使用してエッジをスムージングすることはできます)
  • すべてのハードウェアではサポートされていない

使用するうえでの注意

Forward Rendering

Forward Rendering モードで HDR はイメージエフェクトが存在する場合のみサポートされます。これはパフォーマンスへの配慮によります。もしイメージエフェクトが存在しないのであればトーンマッピングは存在せず、そして強度の切捨てが発生します。この状況でシーンはバックバッファに直接レンダリングされ、HDR はそこではサポートされていません。

Deferred Rendering

HDR モードでは、ライトのプリパスバッファは浮動小数点バッファとして割り当てられます。これによりライティングバッファにおけるバンディングを抑えます。Deferred Rendering の場合、HDR はイメージエフェクトが存在しなくてもサポートされます。

スクリプト

ImageEffectTransformsToLDR 属性をイメージエフェクトのスクリプトに追加すると、ターゲットバッファを HDR ではなく LDR にすることを明示できます。つまり、スクリプトでは HDR イメージエフェクトを適用した後で自動的に LDR に変換することができるという事です。詳細は Writing Image Effects を参照してください。

関連項目

HDR カラーピッカー

API
HDR カラーピッカー