物理的に正しい”明るさ”を使う [Blender Cycles]

スポンサーリンク

最近、PBR : Physically-Based Rendering (物理的に正しいレンダリング)という概念がメインになってきています。

スポンサーリンク

PBRとは

PBR(Physically Based Rendering)マテリアルは現実を忠実に(物理法則に従うように)再現されています。

2012年に、Disneyが新たな概念のシェーダーを発表しました。”Disney principled BRDF“と呼ばれるもので、現実世界の物質は、粗さ(Roughness)と金属さ(Metalness)の2つで数値化出来るという基礎概念を発表したものです。日本語に翻訳している方もいるようなので、論文を読まれてもいいかもしれません。その後2015年に、それを拡張し、Disney principled BRDFに鏡面反射BSDF (反射+透過)とより正確な表面下散乱を統合したDisney BSDFを発表しました。こちらも和訳されていますので、参考にされるととても良い勉強になると思います。ソースコード類も、Walt Disney Animation Studios公式GitHubに実装されているようです。

現実世界の物質は、粗さ(Roughness)と金属さ(Metalness)の2つで数値化出来るという概念は、ラフネス/メタルネス・ワークフロー(Roughness/Metalness Workflow)と呼ばれています。

PBRは現実的なふるまいをするので、このマテリアルが適用されたオブジェクトを、現実の物理法則に従う環境に配置し、現実の物理法則に従う(仮想)カメラで撮影(レンダリング)すれば、理論的には実写と変わりない画像が得られることになります。

これがCGの世界を変えました。従来、現実の物理法則をザックリとマネ(荒い近似)していたので、リアリティのある画像を得るために、場合に応じてマテリアルをいじったり、ライトを足したり、明るさを調整したりと、ある意味「適当」に、いい感じの画像になるように調整する必要があったわけです。
PBRの考え方では、CG世界のすべてを物理法則に従った形にしたことによって、リアリティのある画像を得るために、変な調整をする必要がなくなりました。現実と同じシチュエーションを用意すれば、現実的に破綻のない(CGくさくない)画像が得やすくなりました。

BlenderのCyclesレンダラーにも、Disney BSDFを実装した、”Principled BSDF“シェーダが、バージョン2.79にて実装されました。PBRなVolumeシェーダーとして、”Principled Volume“シェーダも、バージョン2.79最新ビルドにて実装されています。ちなみに、Principled BSDFについてはBlender GuruのAndrew Price氏の動画でとってもわかりやすく解説されているので、使い方はそちらを御覧ください。
Blender2.8に関しては、デフォルトのシェーダーがPrincipled BSDFになっていますし、Volumeシェーダーを使う場合はPrincipled Volumeを使えば、マテリアルに関しては完全にPBRになります。

Principled BSDF
Principled Volume
How to Use Blender's New "Ultimate" Shader: The Principled BSDF

これにてPBRは安心、なわけですが、まだ重要なものがあります。「環境」です。

物理的に正しい”明るさ”

CGにおいても現実でも、何もない世界にモノを一つ置いても、「光源」がなければ「見る」ことはできません。すべてのモノは、光源がないと確認できないのです。CGにおいても、ライトが必要です。
ここで残念なのが、Blender Cyclesのライトは、”Strength”(強さ)に「単位」が書いていないことです。
物理的に正しい明るさ(Physically Correct Brightness)を設定できないと、真のPBRは達成されません。現実でも、部屋の照明が、マッチの火レベルの明るさの環境と、夏場の太陽レベルの明るさの環境では明らかに違います。いくらマテリアルが物理的に正しくても、ライトが物理的に正しい(環境に即している)明るさになっていない場合、正しくない結果が得られる場合があります。Johnson Martin氏の書いた記事がかなり詳しく解説しているので、本記事は、その記事をベースに書いています。

正直なところ、未だによくわからない部分もあります。また随時更新をする予定です。 気になる点があれば教えてください。

Cyclesライトの明るさの単位

公式ドキュメントによれば、SunとMeshランプの”強さ(Strength)”は、“irradiance (放射照度)”という単位です。(他のライトタイプでは違うらしいですが、詳細は不明です。正直、SunとMeshさえあれば問題ありません)

放射照度 Irradiance

irradiance(放射照度)は、SI単位(世の中で一般的に使われる単位のこと)では、ワット毎平方メートル(W/m2)が使われます。このirradianceは、単位面積あたりのエネルギーを表しています。

しかしこのままでは扱いにくいので、一般的に照明の明るさとしての指標となる”illuminance(照度)“に変換します。

照度 Illuminance

illuminanceの単位はLux(ルクス)です。ルクスは、SI単位でルーメン毎平方メートル(lm/m2)とされる単位で、より身近に使われる単位のため、扱いやすくわかりやすいです。この、irradianceからilluminanceへの変換はシンプルではありません。光は波長ごとに持つエネルギーが違うからです。

そこで、ヒトが最も明るく感じる色を基準にします。Luminosity function (比視感度) の最大値は、555.0 nm(緑色)なので、この555.0 nmを基準に考えます。この波長のとき、

1.000 W/m2 = 683.0 Lux

なります。厳密にはこれは概算になります。なぜなら、電磁波(光)はいろいろな波長を含んでいるので、そんなに単純に変換することはできないからです。ただ、ヒトが目で見える範囲の波長はごく短い範囲なので、555.0nmという、可視スペクトルの最も一般的な波長を使用することで十分といえます。

ちなみに、上式から、”1Wのエネルギーから683Luxの照度を得ることができる”と捉える事もできますが、あくまで理論値であり、エネルギーを完全に緑色光に変換できればそうなるということです。ちなみに、白熱電球ではエネルギーの2%ほどしか光に変えることができません。

逆に、LuxからW/m2の変換も、上式を変形することで行うことができます。

1.000 Lux = 0.001464 W/m2

したがって、照度計(ルクス計)を使って現実世界で測った数値(Lux)に、0.001464をかけると、Blender Cyclesでのライトの単位(W/m2)に変換できることになります。

JIS照度基準

現実世界の照明の照度(Lux)は、JIS照度基準(JIS照明基準)がとても参考になります。
表の左側、lxの部分を活用できます。

表は光育.comより。

物理的に正確な太陽モデル

最も一般的な光源といえば太陽でしょう。ということで、この理屈を使って、物理的に正確な太陽モデルを考えてみましょう。太陽定数(solar constant)という、実際に観測されたデータから導かれた値では、地球大気表面が受ける単位時間あたりのエネルギー量は 約1366 W/m2 にあたるとされています(これは最大値で、太陽が天頂にある場合)。このうち、おおよそ20~30%が、大気中での散乱、雲による反射などで宇宙空間に逃げ、残る80~70%が地球表面に到達します。今回は、参考にしたウェブサイトの数値に合わせて、82%が地球表面に到達すると考えます。またこの82%のうち、直接光(direct light)が77%、間接光(indirect light)が5%となります。

次に、太陽から注がれる電磁波のエネルギーのうち、どのくらいが可視光線なのかを考える必要があります。見えない光は、CGレンダリングでは考える必要はありませんからね。WikipediaのSunlightのページにあるSpectrum of Solar Radiationのグラフを示します。

Figure 1. 太陽光のスペクトル分布

この図の可視光(Visible)部分を積分すれば、可視光部分のエネルギーが得られます。John A. Dutton e-Education Instituteのページによれば、太陽光のうち、

  • 赤外光 (700nm以上) : 52~55%
  • 可視光 (400nm~700nm) : 42~43%
  • 紫外光 (100nm~400nm) : 3~5%

となっています。以下の図(スペクトラム)のうち、オレンジ色で塗ってある部分が太陽が放出している波長帯ですね。

ということで、太陽光のうち、42%が可視光となります。したがって、太陽エネルギー1366W /m^2のうち、

直接光(direct light) = 1366×0.77×0.42=441.7644 W/m2
間接光(indirect light) = 1366×0.05×0.42=28.686 W/m2

となります。したがって、Blender Cyclesのサンライト(Sun)の値に442を入れ、バックグラウンド(青空)として、背景光に29を入れれば、物理的に正しい明るさの世界になります。 ここで一つ問題があります。Blenderで上記の数値を適用して、そのままレンダリングすると、おそらく真っ白に飛んだ画像が得られることになります。これは、デフォルトのBlenderの露出管理が適切ではないためです。これを解決し、現実のカメラと同じような露出管理ができる機能が、バージョン2.79より搭載されました。その名も”Filmic Blender” ( “Filmic” )です。

Filmic Color Management

これはカラーマネジメントシステム(LUT)の一種です。Blender GuruのAndrew Price氏の動画でとってもわかりやすく解説されているので、参考として御覧ください。ファイルをダウンロードしている部分は、旧バージョン時代の話ですので、2.79以降であれば標準搭載されています。また、2.8であればデフォルト設定になっています。

The Secret Ingredient to Photorealism

正しい「色」について

いままで、明るさについて議論してきました。もう一つ照明の話で重要なものがあります。「色」です。色は、その光の波長で決定されます。555nmが緑色といった形です。結論からいうと、現在のバージョンでは便利ノード”Blackbody”と”Wavelength”が実装されていますので、Blackbodyノードに色温度(K)を、もしくはWavelengthノードに波長(nm)を入れれば適切な色が出力されます。

Converterノード
コンバーターノード
色温度チャート

参考サイト

!https://www.reddit.com/r/blender/comments/4i3j2c/realworld_lighting_values_for_cycles_lights/
!https://www.reddit.com/r/askscience/comments/4ia1t8/why_does_color_fade_when_left_in_sunlight_for/d2we7p6/
!https://blenderartists.org/t/lighting-cycles-watts-lux-etc/614524
!https://blender.stackexchange.com/questions/261/what-are-the-differences-between-lamps-in-cycles-and-blender-internal
!https://blender.stackexchange.com/questions/45209/what-kind-of-units-does-the-cycles-emission-strength-use
!https://academo.org/demos/wavelength-to-colour-relationship/
!http://www.efg2.com/Lab/ScienceAndEngineering/Spectra.htm
!http://www.midnightkite.com/color.html

コメント

タイトルとURLをコピーしました