物理的に正確なヤツについて
はじめに
こんにちは、物理的に不正確ななんです。
この記事はどうやらUnreal Engine 4 Advent calender 2020 その2の12番目の記事にあたるようです。
今回はぼくにしては辛口に書くのです。なぜなら時間がないのです。年末進行なのです。ラインディレクションをいくつか兼任しているのでヤバイのです。
※しかし弊社、超過業務を強制されることはないし、自主的にも気が乗らないことは一切していないので精神的にとっても楽です。
※そういう文脈でいうと、望んで忙しくしているのは自分自身なので忙しいことウェルカムではありますが、こうした知見共有の機会が若干失われがちなことはSorryと思っている次第でございます。
お題「物理的に正確なヤツ」とは?
わりとアレでございます。聞きなれたようであり、しつこかったり面倒くさかったりなにを言っているんだかよく分からなかったり、開発者側からはさもそれが素晴らしいことで価値あることであるようにプレゼンテーションされるのですが、実際それってどんなメリットがあるんですか?とか、なにそれおいしいの?と言われがちなヤツです。
「物理的に正確なレンダリング」もしくは「物理的に正確なライティング」です。
別名「PBR」でございます。Physically Based Renderingです。
実際のところ、PBRという言葉は知っていても実際にどういうことが行われているのか?っていうと、この記事のタイトルにもある通り「物理的に正確なレンダリングがー!」って念仏のように唱えられるばかりで、内実たるやを語れるひとは意外なほど残念なほどに少ない、というのが観測事実だったりします。
では方針。
今回はシェーダとかマイクロファセット関数の話とかは一切しません。この記事では「UE4における物理的に正確なライティング」について的を絞る所存です。ちょっとテンションがおかしいのはアドカレ公開当日に記事を書いているという焦りと、まぁ間に合うだろう大丈夫だろう本当に大丈夫かなぁ?という、余裕とは言えないようなしかして焦ってもしゃぁないやろ書いたらええやんけ的な空気感が成せるワザであります。
UE4プロジェクトでよくあるやつ
おもむろにプロジェクトを開きましょう。みんな大好きThird PersonでOKです。
☝平板!まちがい…開いた!
なにか不可思議な赤いキャラクタが見える?そうですかお疲れのようですね。眼科か心療内科の受診をお奨めします。もしくは完全食品である寿司を摂取すればいつものグレーマンさまがウホウホ歩く安心が得られるはずです。
Unreal Engine 4といえば…数多のハイエンドゲーム、メジャータイトルに採用され、近年ではゲームの枠を飛び越えて映画のプリビズだとかテレビの放送だとか建築・工業のプロダクトデザインやプレゼンテーションに利用されるなど、高品質な映像とパフォーマンスが売りです。既存の事実です。実証されています。
筆者自身、出身は出版と広告であり実写映像とCG映像分野がもともとのフィールドです。そのため現実のカメラだとか印刷については一定の知識を持ち合わせているのですが、確かにUE4のレンダリングは非常に高品質であることを感じつつも、なにか微妙に釈然としない思いというのがありました。
謎の数値「Intensity 2.75lux」について
これなんだか分かりますか?
はい、そうです。UE4純正テンプレートでよく見かける数値です。
☝ハイコレ
Third Personとかでプロジェクトを作成するとDirectional Lightがこの数値に設定されています。この2.75luxという数値がどこからきているのか?というと…ちょっと調べてみたのですが分かりませんでした。
もう少し正確に話を。
2.75という数値の根拠や理由はよく分からないのですが、luxというのはきちんと規格化された単位です。
ルクスとは、国際単位系における照度の単位である。SI組立単位「ルーメン毎平方メートル」に与えられた固有の名称であり、日本の計量単位令では「1平方メートルの面が1ルーメンの光束で照らされる時の照度」と定義されている。 luxという名称は、ラテン語で光を意味する語からとられたものである。(wikipedia日本語版)
☝と、このように単位として定義されています。さらに、
UE4公式ドキュメントにおいても、実に簡潔にluxとルーメン、カンデラについての解説が成されており、スタジオライティングとか映像制作の現場で使われている単位とまったく同等の定義が行わていることが分かります。
しかしながら…謎の数値「2.75lux」です。一体どこから来たのか…しかも感覚的にはこの不思議な数値で照らされたシーンの明度は適切であるかのように見受けられます。
ところが…これが大きな罠だとぼくは考えていて「なんとなくふつーにライティングされているように見える2.75lux」をベースにゲームを作ったり映像を作り始めてしまうと、現実的なライティングを定量的に行った場合、いろいろな不具合に必然的に絶対的に避けられることなく遭遇してしまうのです。
定量的に話そう
エンジニアリングにおいて「定量的に話す」ことは不可欠である、と考えています。
たとえば競技用自動車のサスペンションセッティングをする際、スプリングをもう少し硬くしようとか言う場合、ドライバーもエンジニアも「バネ定数」に基づいて会話をし、最適なセッティングを見出します。エンジンの適正空燃比率を探す際も、理論空燃比14.3:1をベースにピストンを溶かさず排気系が十分に耐えられる燃焼温度を探っていくわけです。
しかしながら、ことアート分野では「もうちょっと明るく」だとか「赤みを少し出しましょう」という具合に、甚だ感覚的かつ主観的に物事を進めようとするきらいがあります。
誤解なきように少し掘り下げると、現実のデザインの現場ではそんな「ふんわりした話」ではすみません。クライアントだったり、広告代理店の人間はまさに「もうちょっとあーしてー」などとリクエストをしてくるのですが、スタジオのライティングエンジニアはタングステンライトの光量を数値で捉えていますし、ステージ音響のSRエンジニアはどこの周波数をどれだけ上下することでリクエストにあった音質が客席に届くのかを「計算」しています。ウーレのグライコは伊達じゃないのです。
話をUE4に戻しましょう。
問題の2.75luxですが…これ現実的にあり得ない数値です。
こちらの記事が非常に有用ですので紹介します。グレイト!
- 100,000:晴天の昼の太陽光
- 1,000:晴天日の入り一時間前の太陽光
- 100:街灯下
- 1:月明り
☝よく使うlux値を抜き出すとこんな感じ。
定量的に2.75luxを考えると「夜の街路」くらいの照度が2.75luxの物理的な値になります。
自動露出(Exposure)について
はい。
シーンのライティングでは前述のディレクショナルライトをはじめとする光源によるライティングのほかに、間接光(GI)や自動露出(ポストプロセス)による影響が甚大です。さらに、
Unreal Engine 4.24 以前のバージョンから Unreal Engine 4.25 以降のバージョン にアップグレードしたプロジェクトでは、自動露出に相違が生じる場合があります。4.25 以降のバージョンには自動露出の操作性と機能が大幅に改善したために、下位互換性が失われました。
と、公式ドキュメントに記述があるように、UE4.24以前と以後では大幅にExposureのアルゴリズムが変更されています。そのためUE4.24以前で作成したプロジェクトをそのまま4.25以降で開き直すと、端的には自動露出のデフォルト値0.0が1.0に修正されているなどの状況があるのですが、プロジェクト複製の際に自動でコンバートしてくれる機能が入っているようです。
物理的に正しくしてみる
それでは「物理的に正しいライト設定」をThird Personテンプレートで試みてみましょう。
☝10,000luxの状態
はい、アウト。
え?全然だめじゃん!(知ってたけど)
そりゃそうです…2.75luxという物理的にあり得ない照度で「だいたいいい感じ」に見えるようになっていたシーンに、いきなり4000倍くらいの光量を与えればこうなります。
Unreal Engine では、ポスト プロセス ボリュームにある [Max Brightness (最大輝度)] と [Min Brightness (最小輝度)] の設定にデフォルトでピクセル輝度 (cd/m2) を使用します。物理的に正確なライティングの範囲 を設定する際は、EV100 (ISO 100 とも呼ばれる) 準拠の輝度を表すために、自動露出のデフォルトの輝度範囲を拡張することができます。これは、シーン内のライトに対して正しいルクス値を使用し、画像の白飛びを発生させずに、これらの値を自動露出で使用できることを示しています。
☝再び公式ドキュメント(同じページ)を見ると、こういう記述があります。
要するにゲーム用のテンプレートは物理的に正確ではないライティングをしてあるので、もしも映像作品とか厳密なPBRを行うならば、こういう設定をして対応してくださいね!ということですね。
☝プロジェクト設定→Exposureと検索し、赤枠部分を変更して再起動。
この設定によりEV100(ISO100)を基準としたライティングの再マッピングが行われるので(実質的にはダイナミックレンジを広げている)「物理的に正確なライティング」が調整しやすくなります。(後述しますが、この設定は必須ではありません)
☝EV100設定後の10,000luxなシーン(Exposure1.0)
☝100,000luxでExposure1.0
晴天の昼の太陽光下の照度ですから、若干白飛びしたりするのは当然なのでようやく「物理的に正確な感じ」になったのかなー、と思います。
ちなみに、プロジェクト丸ごともっと掘り下げて正確なライティングのサンプルが欲しい!という場合は
Epic Games LauncherのUE4ラーニングのところにある「建築インテリアレンダリング」などでいい感じの室内ライティングをサンプリングすることが可能です。
☝このシーンは室内なので1,000luxでDirectional Lightが設定されていたが、妥当な数値だと思います。また、Exposureの拡張も行われていてEV100にもとづく調整がされていました。興味深い。
そしてMeerkat!
先日Weta DigitalがUE4で作成したミーアキャットのデモ…素晴らしかったですね!
しかもこのプロジェクトがアートソースを含めて無償公開されています。フトッパラ!
多くの皆さんはミーアキャットのアニメーションやファー表現、それにUE4.26から大幅に機能強化されたControl Rigによるスケルトンとアニメーション制御に興味を注がれていることかと思いますが…さすがWeta Digital!と筆者が思ったのは、ライティング設定の素晴らしさでした。
☝Meerkatプロジェクトのシーンライト群
上記Lgt_KeyがDirectional Lightです。
Intensityは日中の砂漠を反映してか170,000luxという高照度が設定されていました。
さらに興味深いのはポストプロセスのExposure設定で、このプロジェクトでは先述したEV100の拡張が行われていません。
測光モードがManualで、露出補正の値は0.0です。
☝PostprocessVolumeのExposureをManualにした場合Cameraの値を調整する。
現実のカメラだと想定した場合、シャッタースピードはもっと速くなる気はしますが…カメラ知識があればこの辺の設定は容易いように思います。
☝ISO40でF14に設定してみた。だいたい同じ絵になる。素晴らしい。
なお、このプロジェクトのレベルには他にも様々な「レンダリングとライティングで見るべきポイント」があるのですが…とりあえず面白かったのはVisualSettings_BPというアクタが置いてありました。
☝こんな感じにコンソールコマンドを送るイベントが組まれている。
このアクタはLevel Sequenceに登録されていてSSGIやLensFlareなどを調整するのに利用されています。
ほかにも挙げだしたらキリがないほどの工夫がこのプロジェクトに投入されているのですが、ぜひさらに解析して「物理的に正確なヤツについて」のUE4応用力を高め、より高度な映像的要求に応えられるようになっていこう!と考えた次第です。
終わりだよ!
さて、明日はオンドレラさんのVR系のなにか、が来るようです。