アンリアル エンジン 4.9 がリリースされたので、テンプレート コンテンツに加えたいくつかの変更について説明したいと思います。主な変更としては、太陽 (指向性ライト、ディレクショナル ライト) の輝度値を全体的に低くしました。また、各テンプレートにスカイライトを加えて空からの環境光の影響を考慮に入れて、一段とリアルな外観を実現できるようにしました。こうした変更は何気なく加えられたものではなく、複雑な疑問に根差したものです。「あれは何色なんだろう?」という疑問です。その答えは、皆さんが考えているほど単純ではないことを我々は学びました。
レンダリングについて言及する場合、使用する多くの用語は写真の考え方が元になっています。任意の実世界の物質の色を再現したい場合や、実世界で撮ったリファレンス写真に合わせたい場合には、様々な要因が絡んできます。物体が実際にどれくらい明るいか、暗いか、また物体にぶつかる光がどれくらい明るいかなどが主な要因です。アウトドア環境では、拡散光はあらゆる方向からやってくるため、それを考慮する必要があります。さらに、対象となる露出値を把握する必要があります。写真の場合は、カメラのシャッターがどれくらい長く開いているか、画像を撮ったフィルムの感度などを理解する必要があります。
こうした変数は、任意の物体の実際の明るさを知ることが、「写真を撮って、カラー値をサンプリングする」というほど簡単ではないことを表しています。ある値は他のすべての値に対して相対的であり、「物の色」の実際の基準値マーカーは単純なものではありません。視覚的な例で説明します。次のバスケット ボールの写真をご覧ください。
一番左の画像はカメラに適切な露出を算出させたバスケットボールです。中央の画像は同じバスケット ボールですが、露出値は -2 です。一番右の画像の露出値は +2 です。この 3 つの中で正しいものはどれでしょう? 実際のところ、3 つとも正しくもあり、またどれも正しくないとも言えます。この画像を生成した設定 (カメラのシャッター スピード、フィルムの感度、カメラ レンズのアパーチャー サイズ) がわかっていたら、画像をリバース エンジニアリングして、実際に目で見ている色の値が何であるかにことができます。ここでの問題は基準値がないということです。例えば、バスケット ボールを撮った別の画像では、その色が通常のボールよりも 2 倍暗く、2 倍の明るさで撮ると、多くの点で「バスケットボールのように」見える画像になります。しかし、これは物体の実際の色を示したものではありません。簡単に言うと、何もかもが相対的であるということです。ここで必要となるのは他の物質と比較して実際の色と輝度、すなわちその反射率を割り出すことができる普遍的な基準値です。
アメリカの写真家、Ansel Adams の名前で検索してみてください。Adams 氏は写真家の Fred Archer 氏と共に、「ゾーン システム」を開発しました。これは実世界の物体の反射値の標準範囲をコード化し、それを 11 種類に体系化しました。これは写真家が撮影するときにキャリブレーションする際に便利な基準になります。
ゾーン システムは奥が深いものであり、このブログで扱う範囲外です。ただし、彼らのリサーチには我々にとっても意味がある基本的な発見がひとつあります。人間が作った物体以外で、自然界にあるほとんどのものは 2 つの大まかな値のいずれかに入ります。すなわち真っ黒な「すす」、および雪の明るさです。暗い「すす」は、入射光の 3 % 程度をビューアーに反射します。新雪は入射光の 95 % 程度を反射します。こうした値を様々なサーフェスの反射の最小と最大の値となるブックエンドのようなものと考えると、「幾何平均 (geometric mean) 」と呼ばれるこうした値の平均値を使って、平均的マテリアルが反射する光の平均量の値が得られます。この値は 18 % の反射であり、「中間グレー」としても知られています。ここでは我々独自の基準値があります。
写真や CG の世界では画像生成をキャリブレーションする基準値として 18 % は標準になっています。基本的な考え方として、完全に 18% のグレー、ディフューズの物体 (球体やカードなど) の写真を撮り、それを使用して露出やホワイト バランスをキャリブレーションします。これで、シーン内の他のすべての物体がこの既知の値と比較してどれくらい明るいか、または暗いかを把握できるようになります。
この理論は概ね間違ってはいませんが、何故、この新しい基準値を持つことで、サンプル マップの太陽光が薄暗くなるのでしょうか? この点に関して、エンジン自体に話を戻します。
まず、仮想の 18% グレー球体を作ります。便宜上、かなり「大まかな」ものになっていますが、ペイントされた実世界の球体に非常に近いものになります。以下はアンリアルで表現した球体です。
次の目標はシーンをセットアップすることです。この球体の最も明るいポイントで、アセットの実際の輝度値を反射するようにします。これは、18% (すなわち 0.18) であることがわかっています。これを行うには、ライティング有りのシーンにアセットを配置し、指向性ライトをアセットに向けて太陽光をシミュレーションします。次にライトの方向自体からアセットを見て、球体上で最も明るいポイントの実際の色の測定値が 0.18 になるようにライトを微調整します。これを実現するには、“Visualize HDR” というビルトインのエンジン機能を使用します (Viewport->Show->Visualize->HDR(Eye Adaptation) の順序でアクセスします)。これで、ガンマ補正前のシーン内の物体の実際の色が表示され、単に画面上に表示されている値ではなく、「実際の」色の値を見つけます。
弊社のレンダリング チームによると、「実際の」物体の色になるライトの輝度の期待値は (ニュートラルな露出条件で)、約 pi (~3.1415) の値になるということです。これは我々のライティング アルゴリズムの影響であり、ハイエンド レンダラーのオフライン レンダリングやアンリアルで共通の値です。ただし、これはサーフェス上の任意のポイントだけがひとつの光源からのライトを受けていることを想定していますが、これは決して起こりません。空間内のあるポイントがそこから見える何もかもからライトを受ける状態を想像しなくてはなりません。空から分散し、地面から反射し、あちこちに浮いている小さなパーティクルの間をインスキャタリング(inscatter, 内散乱) するライトを持ちます。これをシミュレーションするために、シーンにスカイライトを加えてニュートラルな日中の太陽光の設定にします。この方法で環境光の強度をシーンに追加するので、次にその寄与を打ち消すように幾分、太陽光を低くしますが、それでも、ディフューズ イルミネーションが起こるようにし、全体的なライトの寄与として pi (3.1415) の必要としていた初期値になるようにします。
ここでは完璧を求めていないということを伝えたいと思います。正確な値よりも、利用可能な直観的な値一式の方が役立つという理由は数多くあります。例えば、正確な値に対する露出の段の 1/4 または 1/2 内があります。これらの中には簡単に覚えられる値が必要とされています。我々のケースでは、太陽の明るさが 2.75 で、スカライトの明るさが 1 になります。こうした値を足しても、3.14 にならないことがわかります。適切な基準値に対して多くの解釈があります。例えば、一部のカメラ メーカーでは、露出を 0.18 基準値の反射で内部でキャリブレーションし、他のメーカーでは、0.16 や 0.12 でキャリブレーションしています。我々の設定は、こうした変数値の中で中間的な値になります。また、太陽光の強度は、曇りの日、非常に暑く明るい、太陽が輝く午後であるかどうかで大幅に変わります。
簡単に言うと、繰り返しになりますが、何もかもが相対的であるということです。こうした新しい値は多様な選択肢の中で適切な妥協点になり、多くの面で実際の情報に近くなり、フォトリアルなコンテンツの制作者がアセットをキャリブレーションするためのより良い基準値になります。