カメラおよび露光エフェクト
トーン マッピング
物理的な光のレベルをレンダリングする際には、実際の物理に則った HDRI 出力とコンピュータ ディスプレイのダイナミック レンジの制限の間で調整をしなくてはならない、という問題があります。この問題の詳細については、 ガンマを参照してください。

トーン マッピング実行前

...トーン マッピング実行後
"トーン マッピング" を実行するシェーダとアルゴリズムは多数あります(トーン マッピングは、CG 業界で積極的に研究されている分野です)。建築用のライブラリには次の 2 種類のシェーダが用意されています。1 つは、過剰な明るさを管理可能な範囲に "丸め込む" ために圧縮を追加する、非常にシンプルなシェーダです。もう 1 つは、一般的なカメラのパラメータを使用して実際の測光量の照度をイメージに変換する、より複雑で "フォトグラフィック" なシェーダです。
これらのシェーダは、レンズ シェーダ(レンダリング時には瞬時にその場でイメージのトーン マッピングを実行します)または出力シェーダ(ポスト プロセスとしてイメージのトーン マッピングを実行します)として適用できます。
これらのトーン マッパはいずれも各ピクセルに個別に作用するため1、レンズ シェーダとして適用する方法を使用することをお勧めします。この方法では、ピクセル レベルではなくサンプル レベルで適用されるためです。
また、両方のトーン マッパにはガンマがあります。イメージ処理のパイプラインのいずれかの段階(イメージ ビューア、合成段階など)でガンマ補正を既に適用しているかどうかを確認することが重要です。既に適用している場合は、これらのシェーダではガンマ補正を 1.0 に設定する必要があります。ガンマ補正を適用していない場合、独自のガンマを適用しないビューアを使用して画面上に直接イメージを表示するには、おそらくこれらのシェーダのガンマを 1.8 から 2.4 の値に設定して使用する必要があります。
"シンプル" なトーン マッパ
mia_exposure_simple
declare shader "mia_exposure_simple" (
scalar "pedestal" default 0.0,
scalar "gain" default 1.0,
scalar "knee" default 0.5,
scalar "compression" default 2.0,
scalar "gamma" default 2.2,
color texture "preview",
boolean "use_preview"
)
version 1
apply lens, output
end declare
このトーン マッパの処理は非常にシンプルです。実際の物理的な照度値を参照しません。単にハイ ダイナミック レンジのカラーを取得し、以下の順序で処理を実行します。
- pedestal をカラーに追加します。
- 次にカラー コンポーネントを gain で乗算します。
- 算出したカラーが knee 値を上回っているかどうかを確認します。
- 上回っている場合、圧縮比率 compression によって "丸め込み" ます。
- 最後に、gamma を使用してガンマ補正を実行します。
理論は以上のとおりです。次に、これらのパラメータの実践的な使用方法について説明します。
pedestal を変更することは、"黒レベル" を調整することと同じです。正の値を設定すると、光が追加されるので、最も黒い黒でさえグレーがかかった色になります。負の値を設定すると、光が差し引かれるので、"黒が潰れて"、よりコントラストの強い芸術的な効果が得られます。
gain は "輝度調節つまみ" の役割を果たします。これが、ハイ ダイナミック レンジ値がロー ダイナミック レンジ値に変換される主な点です。たとえば、カラー強度のおおよその範囲が 0 ~ 10 の間だと分かっている場合、この範囲を目的の 0 ~ 1 の範囲にするには、この値を約 0.1 に設定する必要があります。
しかし、トーン マッピングの目的は、やみくもにこの範囲を直線的に縮小することではありません。単純に 0.1 に設定すると、おそらく暗くてつまらないイメージしか得られません。たいていは 0.15 または 0.2 に設定します。ただし、0.2 に設定すると、0 ~ 10 の範囲が 0 ~ 2 にマッピングされます。では、1.0 以上に設定した場合は、どのように処理されるのでしょうか。
ここで圧縮が実行されます。knee レベルは、過剰な明るさの "丸め込み" が開始されるポイントです。これは gain の後に適用されるため、0.0 ~ 1.0 の範囲である必要があります。通常は、0.5 ~ 0.75 の範囲に設定することをお勧めします。
ここでは 0.75 に設定します。つまり、(pedestal が追加され、gain で乗算された後の値が) 0.75 を上回るカラーは"圧縮" されます。compression が 0.0 の場合、圧縮されません。compression が 5.0 の場合は、かなり大幅に丸め込まれます。
最後に、"丸め込まれた" カラーは、出力デバイス(コンピュータ画面など)用にガンマ補正されます。
use_preview および preview パラメータは、トーン マッパを調整するプロセスを若干 "インタラクティブ" にするために使用します。
シェーダをレンズ シェーダとして適用する場合の使用方法は、以下のとおりです。
- mia_exposure_simple シェーダを無効にします。
- イメージを HDR 対応フォーマット(exr、.hdr など)のファイルにレンダリングします。たとえば、
preview.exr に保存します。
- mia_exposure_simple シェーダを再度有効にします。
- preview パラメータを上記で保存したファイル(ここでは
preview.exr)に設定します。
- use_preview パラメータを有効にします。
- フォトン マッピングまたはファイナル ギャザリングを無効にします。
- 再度レンダリングします。実際にレンダリングは実行されず、イメージは
preview.exr から読み込まれ、即座にスクリーンにトーン マッピングされるため、レンダリングはほぼ瞬時に完了します。
- パラメータを調整し、思い通りの結果が得られるまで再度レンダリングします。
- フォトンまたはファイナル ギャザリングを再度有効にします。
- use_preview をオフにします。
- 以上でトーン マッパの調整は完了です。
"フォトグラフィック" なトーン マッパ
mia_exposure_photographic
フォトグラフィックなトーン マッパは、実際のピクセルの輝度(カンデラ/平方メートル単位)を、カメラが捉えるようなイメージのピクセルに変換し、露光用のカメラ関連パラメータ(F ストップやシャッター速度)を適用し、トーン マッピングを適用してフィルムやカメラのような効果を再現します。
以下の 2 つの基本モードがあります。
- "フォトグラフィック(Photographic)" - 入力値はカンデラ/平方メートル単位(またはカンデラ/平方メートル単位に変換可能)としてみなされます。
- "任意(Arbitrary)" - シーンのピクセルは、特定の物理単位としてはみなされませんが、単に画面の表示範囲に一致するように係数によってスケールされます。
film_iso (フィルム ISO)がゼロ以外の場合は、"フォトグラフィック" モードが使用され、ゼロの場合は、"任意" モードが選択されます。
declare shader "mia_exposure_photographic" (
scalar "cm2_factor" default 1.0,
color "whitepoint" default 1 1 1,
scalar "film_iso" default 100,
scalar "camera_shutter" default 100.0,
scalar "f_number" default 16.0,
scalar "vignetting" default 1.0,
scalar "burn_highlights" default 0.0,
scalar "crush_blacks" default 0.25,
scalar "saturation" default 1.0,
scalar "gamma" default 2.2,
integer "side_channel_mode" default 0,
string "side_channel",
color texture "preview",
boolean "use_preview"
)
version 4
apply lens, output
end declare
"フォトグラフィック モード" (film_iso がゼロ以外)では、cm2_factor (Cm2 係数)はピクセル値とカンデラ/平方メートルの間の変換係数です。詳細は以下で説明します。
"任意" モードにおいては、cm2_factor は、単にレンダリング済みのピクセル値を画面のピクセルにスケールするために適用される乗数です。これは、 gain パラメータ(mia_exposure_simple 内)に似ています。
whitepoint (白色点)は、出力の "白" にマッピングされるカラーです。この色相/彩度のカラーはグレースケールにマッピングされますが、強度は変更されません。
film_iso は、フィルムの ISO 数値で、"フィルム感度" とも呼ばれます。前述のとおり、この値がゼロの場合、"任意" モードが有効になり、カラー スケーリングがcm2_factor の値によって厳密に定義されます。
camera_shutter (カメラ シャッター)は、カメラのシャッター速度を分数で表したもので、単位は秒です。たとえば、値が 100 の場合、カメラのシャッター速度は 1/100 です。この値は、"任意" モードでは無効です。
f_number (F 番号)は、絞りの数値を分数で表したものです。たとえば、11 の場合、絞りは "f/11" です。カメラの絞りの数値は、"f/8"、"f/11"、"f/16"、"f/22" のように、特定の標準的な系列が使用されています。これらの各数値は、"ストップ" と呼ばれ(実際のレンズの絞りリングには、これらの値ごとに物理的な "ツメ" が付いています)、各 "ストップ" は、ストップごとにフィルムに感光する光の量を表します2。このシェーダは "ストップ" を計算しませんが、実際に特定のストップを示す F 値を指定する必要がある点に注意してください。この値は、"任意" モードでは無効です。
実際のカメラでは、光がフィルムに感光する角度が露光に影響を及ぼし、イメージの周囲が暗めになります。vignetting (ビネッティング)パラメータがこの現象をシミュレートします。0.0 の場合はオフで、値が高くなるほど、周囲がより暗くなります。このエフェクトは、光線がフィルム面に当たる角度の余弦に基づいているため、カメラの視野による影響を受けます。正射投影レンダリングでは無効です。既定値として 3.0 を使用すると、コンパクト カメラと同様の効果が得られます3。
パラメータ burn_highlights (焼き付けハイライト)および crush_blacks (クラッシュ黒)は、イメージの実際の "トーン マッピング"、つまりハイ ダイナミック レンジのイメージをディスプレイ デバイスの白~黒の範囲に収まるように適応させる方法を決定します。
burn_highlights が 1 で crush_blacks がゼロの場合、変換は直線的です。シェーダはシンプルで直線的な強度スケーラーのように機能するだけです。
burn_highlights は、どの程度の "露出過度" を許容するかを決定するパラメータとみなすことができます。1 から 0 に向けて値が小さくなるにつれて、高い強度がより低い強度に "圧縮" されます。0 の場合、圧縮曲線は漸近的です。無限の入力値が白 の出力値にマッピングされ、露出過度は起こらなくなります。既定値として適切な値は 0.5 です。
ダイナミック レンジの上部が圧縮されると、当然、以前のコントラストの一部が失われるため、通常は crush_blacks パラメータを使用してイメージにある程度の "めりはり" を取り戻す必要があります。値が 0 の場合、低い強度の範囲は直線的になりますが、1 に向けて値を大きくすると、強度が "極端に高い" 領域が変換曲線に追加され、低い強度は緩やかに黒に近づきます。
明るいカラー コンポーネントを圧縮すると、この処理の特性上、より低い彩度のカラーに近づきます。非常に強い圧縮をかけると、極度に彩度が低く、魅力のないイメージになる場合があります。saturation (彩度)パラメータを使用して、最終的なイメージの彩度を芸術的な見地からコントロールできます。1.0 は標準的な "変更されていない" 彩度で、値を高くすると彩度が高くなり、値を低くすると彩度が低くなります。
gamma (ガンマ)パラメータは、ディスプレイのガンマ補正を適用します。イメージ処理のパイプラインで、ガンマを 2 度適用しないように注意してください。詳細については、 ガンマを参照してください。
side_channel (サイド チャネル)および side_channel_mode (サイド チャネル モード)は、シェーダの OEM 統合用で、"インタラクティブ" な調整をサポートするために使用します。また、変換前に出力シェーダを "ディスプレイのピクセル値" に挿入するためにも使用します。
これには、シェーダの 2 つのコピーを、それぞれレンズ シェーダと出力シェーダとして適用します。2 つのシェーダは、"サイド チャンネル" を介してやり取りします。サイド チャネルは個別の浮動小数点フレーム バッファで、レンダリング前に設定する必要があります。
side_channel_mode の有効な値は以下のとおりです。
- 0 - シェーダはレンズ シェーダまたは出力シェーダとして通常通りに実行されます。
- 1 - レンズ シェーダは、トーン マッピングが実行されていない値を side_channel フレーム バッファに保存します。出力シェーダは、メイン フレーム バッファ内のピクセルではなく、サイド チャネル内のデータに基づいてトーン マッピングを再度実行します。
- 2 - レンズ シェーダはオプション 1 と同様に動作し、出力シェーダはピクセルを side_channel フレーム バッファからメイン フレーム バッファに読み込みます。これは、出力シェーダから出力されたピクセルに対して、メイン フレーム バッファでの処理のみがサポートされているサード パーティの出力シェーダを使用する場合に便利です。
トーン マッピングをポスト プロセスとして適用する場合、なぜレンズ シェーダの適用を完全に省略しないのかという疑問を持つかもしれません。その理由は 2 つあります。1 つ目は、レンズ シェーダを適用すると(その出力を決して使用しないとしても)、レンダリング中に 確認することができて便利なためです。2 つ目は、mental ray のオーバー サンプリングが、メイン フレーム バッファのピクセルによって決まるためです。これらのピクセルがフル ダイナミック レンジに残っている場合、mental ray は不必要に数千の余分なサンプルを "高コントラスト" 領域に投射し、最終段階でその領域がすべて白にすべてトーン マッピングされる可能性があります。
use_preview (プレビューの使用)および preview は、前述した mia_exposure_simple シェーダのパラメータとまったく同様に動作します。
例
フォトグラフィックなトーン マッパを調整する実践的な例を見ていきましょう。ここでは、太陽と空シェーダ、mia_material、窓用のポータルライトを使用した、屋内と屋外の両方の領域が含まれたシーンを例に取ります。単位は、未加工のピクセルがカンデラ/平方メートル単位になるように設定されます。
トーン マッピングを実行していない、未加工のレンダリング イメージは以下のようになります。

トーン マッピングなし
これはガンマを 1 に設定し、トーン マッピングを実行しない場合の典型的なイメージです。明るい領域は白とびし過ぎていて、シャドウは非現実的なほど強くて暗く、カラーの彩度は極端に高い状態です。
以下の設定で mia_exposure_photographic を適用します。
"cm2_factor" 1.0,
"whitepoint" 1 1 1,
"film_iso" 100,
"camera_shutter" 100.0,
"f_number" 16.0,
"vignetting" 0.0,
"burn_highlights" 1.0,
"crush_blacks" 0.0,
"saturation" 1.0,
"gamma" 2.2,
...イメージは次のような結果になります4。

"Sunny 16" の結果
ここで使用した設定は、写真の "Sunny 16" を基準としています。これは、絞りが f/16 の場合、フィルム感度(ISO 数値)と同じシャッター速度(分数値、秒単位)を設定すると、晴れた日の屋外のシーン用の適正露出を生成します。ご覧のとおり、屋外の領域は問題ありませんが、屋内の領域は明らかに露出不足です。
写真では、"フィルム感度" (ISO 値)、絞り(F 値)、シャッター速度がすべて相互作用し、実際のカメラの露出が決まります。そのため、露出を変更する場合は、3 つのうちのどれを変更しても、"同じ" 結果が得られます。たとえば、イメージの明るさを半減させるには、シャッター速度を倍にするか、フィルムの ISO 感度を半分に減らすか、絞りを 1 "ストップ" (たとえば、f/16 から f/22 に変更します。詳細は、f ストップを参照)変更します。
現実世界のカメラでは、これらの方法の間には若干の違いがありますが、このシェーダを使用する場合は数学的に同等です。

f/8

f/4
明らかに f/4 のイメージは屋内の領域には最適ですが、屋外の領域は露出過度です。これは、burn_highlights パラメータを 1.0 に設定しているので、ハイライトの圧縮がまったく実行されないためです。
burn_highlights (焼き付けハイライト) = 0.5
burn_highlights (焼き付けハイライト) = 0.0
左のイメージは、露出過度がある程度抑えられています。右のイメージでは burn_highlights がゼロに設定され、露出過度がすべて完全に除去されています。ただし、この場合、イメージのほとんどのコントラストが失われるという欠点があります。実際のフィルムでは、過剰な明るさの圧縮を実行するものの、魔法のようにすべての露出過度を一掃するフィルムは存在しません。そのため、 burn_highlights をゼロ以外の小さい値に設定しておくことをお勧めします。この例では、0.5 を選択しています。
実際のカメラでは、イメージの周囲が減衰します。これは "ビネット" と呼ばる効果で、同じ名前のパラメータを使用することによって、このシェーダで再現できます。
vignetting (ビネッティング) = 5
vignetting (ビネッティング) = 11
右のイメージでは、興味深いことに、ビネットによる減衰がイメージの周囲で発生し、屋外の露出過度の抑制に "役立って" います。ただし、左側のエッジが暗くなり過ぎています。
ここでは中間を取って vignetting を 6 に設定し、burn_highlights を 0.25 に変更してみましょう。次のようなイメージになります。
vignetting (ビネッティング) = 6
burn_highlights (焼き付けハイライト) = 0.25
きれいなイメージではありますが、実に "コントラスト" が欠如しています。これを改善するには、crush_shadows パラメータを調整します。
crush_shadows (クラッシュ黒) = 0.2
crush_shadows (クラッシュ黒) = 0.6
crush_shadows パラメータは、強度曲線の下端を濃くするので、非常に優れたコントラストが得られます。ただし、このイメージは既に "暗過ぎる" 状態に近いので、イメージ全体が少し暗くなります。
これは露光を変更することによって補正できます。いくつか異なる shutter 値を試し、burn_highlights 値をさらに低く設定して露出が過度になるのを防ぎます。
shutter (カメラ シャッター) = 50、
burn_highlights (焼き付けハイライト) = 0.1
shutter (カメラ シャッター) = 30、
burn_highlights (焼き付けハイライト) = 0.1
最終的なイメージは非常に良い出来栄えです。ただし、大量のハイライトの圧縮を行っているため、カラーの彩度が大幅に失われています。以下のように補正して仕上げましょう。
saturation (彩度) = 1.0
saturation (彩度) = 1.4
これで一部のカラーが元に戻り、非常にバランスの取れたイメージに仕上がっています。ただし、屋外にまだ問題があります。これはおそらく物理的に正確な範囲で得られる最善の結果です。
しかし、窓にポータル ライトを使用していることを思い出してください。ポータル ライトには非物理的な "透明度" モードがあります。このモードは、まさにこの問題を解決するためのものです。これまでの結果がたとえ物理的には "正確" でも、多くの人々は、屋外のシーンがもっとよく見えるはずだと直感的に感じるはずです。人間の目には、太陽に照らされた屋外と、それよりも大幅に暗い屋内の間のダイナミック レンジの大きな差を補正する優れた機能があるため、コンピュータにも同様の処理を期待します。ポータル ライトの透明度機能を使用すると、屋内に入射する実際のライトの強度を実際に変更することなく、これを視覚的に実行できます。

ポータル ライトの
transparency (透明度) = 0.5
これで屋外のオブジェクトが確認でき、屋内のコントラストも維持されます。屋内の光のレベルは変更されておらず、現実の世界の値に忠実な状態のままです(窓に実際の暗いガラスを配置した場合とは異なります。その場合には入射光も減衰します)。
これは真昼のシーンです。では、時間帯を変更し、太陽が地平線に沈むとどうなるでしょうか。 シーンは大幅に暗くなるため、露光を変更して補正します。

午後 7 時

shutter (カメラ シャッター) = 1/2 秒
同じ設定(左)を維持したまま、新しい太陽の角度を設定すると、非常に暗いイメージになります。右のイメージでは、シャッター速度を 2 (1/2 秒)に変更しただけです。このイメージは、赤みのある太陽光と黄色がかった白熱のライティングによって、少し黄色がかっています。これを補正するには、whitepoint を黄色がかった色に設定します。

whitepoint (白色点)が調整された夜間のショット
ランプ付近の露出過度の問題が残っているので(実際の写真でも同様ですが)、burn_highlights を非常に低い値に設定して(ただし、ゼロ以外の値に設定して多少 "めりはり" を残します)最終的なイメージを作成します。
burn_highlights (焼き付けハイライト) = 0.01
写真関連のパラメータは、写真の経験のあるユーザにとって、適切な値を選択する判断材料になることがお分かりいただけたでしょう。直感的な "外観" をコントロールするパラメータを使用すると、イメージを調整して視覚的に魅力のある結果を得ることができます。
被写界深度/ぼけ
"ぼけ" は "ブラー" を意味する日本語で、写真のピントが合っていない領域の "見た目" を表すために使用されます。"被写界深度" (DOF)は、実際にはブラー自体を表すのではなく、ピントが合っている領域の深度を表します。ただし、通常の会話レベルでは、ブラーと "DOF" は同じことを指す場合がほとんどです。
このシェーダは、物理ライブラリの physical_lens_dof に非常に似ていますが、実際の外観やブラーの精度をよりコントロールできます。
declare shader "mia_lens_bokeh" (
boolean "on" default on,
scalar "plane" default 100.0,
scalar "radius" default 1.0,
integer "samples" default 4,
scalar "bias" default 1.0,
integer "blade_count" default 0,
scalar "blade_angle" default 0,
boolean "use_bokeh" default off,
color texture "bokeh"
)
version 4
apply lens
scanline off
end declare
on (オン)はシェーダを有効にします。
plane (プレーン)はカメラから焦点面までの距離です。カメラからこの距離分離れた位置に、完全に焦点が合います。

カメラから近い焦点

カメラから遠く離れた焦点
radius (半径)は錯乱円の半径です。これはシーン単位の実際の寸法で、現実世界のカメラの場合、これは絞りの半径とほぼ同じです。つまり、カメラの f ストップに依存します。しかし、経験則上、約 2 ~ 3 センチのサイズ(現在のシーン単位)に維持することをお勧めします。このサイズに設定しない場合、シーンは非現実的になり、ミニチュアのように見えます5。

小さな半径 - 深い DOF

大きな半径 - 浅い DOF
samples (サンプル)は投射されるレイの数を定義します。数が少ないほど高速ですが粗くなり、多いほど低速ですが滑らかになります。

少数のサンプル

多数のサンプル
bias (バイアス)が 1.0 の場合、錯乱円は均一の円盤としてサンプリングされます。値が低いほど、サンプルの確率が円の中心付近に分布し、"ぼんやり" とした、"より柔らかい" DOF 効果が作成されます。値が高いほど、サンプルの確率がエッジ付近に分布し、明るいスポットが小さな円として解決された、"より強い" DOF が作成されます。

bias (バイアス) = 0.5

bias (バイアス) = 2.0
blade_count (ブレード数)は、錯乱 "円" の "エッジ" の数を定義します。ゼロを設定すると、完璧な円になります。 また、blade_angle (ブレード角度)パラメータを使用して角度を設定することもできます。0.0 はゼロ度、1.0 は 360 度を表します。

blade_count (ブレード数) = 6、angle (角度) = 0.0、bias (バイアス) = 2.0

blade_count (ブレード数) = 4、angle (角度) = 0.1、bias (バイアス) = 2.0
use_bokeh (ピンぼけの使用)パラメータは、特定の bokeh (ピンぼけ)マップの使用を有効にします。このパラメータを使用する場合、パラメータ bias、blade_count、blade_angle は無効になります。このマップは、DOF フィルタ カーネルのシェイプを定義するので、黒が背の白く塗りつぶされた円は、標準のブラーに相当します。一般に、カスタムぼけマップを正確に "解決する" には、最適なサンプリング配分機能を持つ組み込み型のぼけシェイプに比べて、より多くのサンプルが必要です。

クロス シェイプのぼけマップ

カラー マップによる色収差
bias が 1.0、samples が 4、blade_count が 0、use_bokeh がオフに設定されたこのシェーダは、古い physical_lens_dof シェーダと同じイメージをレンダリングします。
脚注- 1
-
多数の高度なトーン マッパは、イメージのさまざまな領域を他の領域と比較してウェイト付けすることによって、人間の視覚システムを擬似的に再現します。これらのトーン マッパは、"処理を実行する" 前にイメージ全体を必要とします。
- 2
- F 値は、"f ストップ" と呼ばれる場合もあります。ここでは分かりやすくするために、F 値という用語を使います。 ここでは分かりやすくするために、F 値という用語を使います。
- 3
- 技術的には、ピクセルの強度は、フィルム面に対する光線の角度の余弦をvignetting パラメータで累乗した数によって乗算されます。
- 4
- トーン マッピング シェーダを設定して迅速に結果を得るには、プレビューの使用で説明した "preview" パラメータを使用するワークフローを試してください。
- 5
- 絞りの直径は、レンズの焦点距離(シーンの単位)を F 値で除算した値です。このパラメータは直径ではなく半径なので、その半分になります。つまり、(focal_length / f_number)/ 2 となります。