37.4K Views
December 19, 19
スライド概要
講演動画はこちら
https://www.youtube.com/watch?v=2nhpfKYbohQ
発表者: 西下誠哲さま(フリーランス)
本スライドは2019年12月15日に行われた勉強会「 UE4 Environment Art Dive」の講演資料となります。
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
UE4をレンダラとした 趣味的スピード背景ルックデブ ©2019 車高短ゲームス All rights reserved.
自己紹介 西下 誠哲(メタリカ) フリーランスのデジタルアーティスト。 UE4を用いたゲーム開発を行っています。 普段はテクニカルアーティスト(TA) としての業務を行っています。 https://twitter.com/lovemetallica
自主制作 自主制作自体はUE4に触れる前から、 CGの検証を兼ねてやってました。 かつてはMental-Rayでのオフライン レンダリングが多く完全に趣味です。 UE4はお仕事がきっかけで2014年頃から 始めました。(それ以前にもUDKは1か月程触る)
バージョン 自主制作時に使用したUE4のバージョンは4.8~4.23 エディタは英語表記。 本スライドでのUnrealEngine4は「UE4」と表記します。 作業環境 CPU : Core i7 GPU : GeForce GTX 770 Memory : 32GB
本日の内容 スピーディに作る背景CG表現及び、趣味の追及など雑多に。 ・リファレンス 好きなものや身近なもの、実体験に基づいたリファレンス資料。 ・シーン構築 DCCツールから制作スタート。UE4に移ってからはBSPなどの機能で素早く。 ・シェーディング 基本は簡素なマテリアル。特殊表現およびこだわり系は色々頑張って試してみる。 ・ライティング/レンダリング 色々な準備と学習。調整のイテレーションは高速に。最重要工程。 ・ポストプロセス カラーグレーディングや特殊効果のPostProcessMaterialで仕上げる。 ・その他
まずUE4で趣味で作ったものをいくつか。 数年前から日曜日の午後に少しづつ作ってました。 ピックアップして動画にまとめました。
動画にもありましたが、 たまにTwitterに上げてる画像は こういう感じのものです。
ちなみに、 初UE4の作品は たぶんコレです。
●リファレンス
リファレンスについて 制作の前にリファレンスとなる資料を集めます。 ですが、実際に目で見て確認出来る資料が、特に用意せずとも既に存在している場合は、 資料集めをせずに制作を開始する事も多々あります。(おすすめは出来ませんが...) 具体例として「シャワールーム」のシーンは自宅のやつまんまです。 寸法を現物から計測して作り、シャワーやトイレ等だけリフォームを想定したモデルに 差し替えてUE4に出しています。 (実際にS友不動産の営業担当にUE4上でプランを提示しました)
リファレンスの一例 ・軍艦島(長崎県 端島) 以前行ってきました。 ご厚意により通常の観光では 入れないところまで取材をする 事が出来ました。 迫力ある65号棟の再現を試みまし たが、日給社宅のほうがSponza っぽかったのでそっちに浮気しま した。
リファレンスの一例 ・ホームシアター 使用しているAV機器群をそのまま リファレンスとしました。 スピーカー、サブウーファー等も 同様なので資料を見ずに制作しています。 (現物を見ながらモデリングした)
リファレンスの一例 ・クルマ 長らく通勤で乗ってるやつです。 トヨタ:クラウンマジェスタ (通称18マジェ) CG上での想定は、 タイヤ F:235/30R20 R:245/30R20、 ホイールはオリジナル20インチ、 サスはエアサスコントローラーと SSキットの組み合わせ、リアフォグ、 エアロ、ヘッドライトインナー加工、 ハイフラ、マフラーカッター、字光式 ナンバープレート、フルスモ等々。 基本的に現車に近い設定です。
リファレンスの一例 ・島 タイのビーチリゾートにある美しい島々です。 現地の風景が脳裏に焼き付いているので、 撮ってきた写真と記憶を頼りに作りました。 (左から、パタヤのラン島・プーケット近くのピピ諸島・クラビのビーチ)
リファレンスの一例 ・回廊、プールなど このあたりも見てきたものそのまま制作。 回廊はイギリスのカンタベリー大聖堂。 プールもイギリス湖水地方のスパ、 またはタイのホテルにあるプールを リファレンスとしています。
●シーン構築 好きなものを好きなように手間暇かけず制作 Huuumm...
シーン構築について モデリングは凝った事はやっていません。 作業速度重視で何となくの見た目になる 程度で妥協しています。 ・背景シーンはDCCツール上 (Maya、blender等)で予め仮組み。 ・UE4のBSP(ブラシ)を多用 ・これぞというプロップは多少頑張って モデリングする ・スカルプトはしてません ・SubstanceもHoudiniも何もなし。
シーン構築の掟 個人的なしばりプレイになりますが、 「モデルアセットは基本的に すべて自前で用意する」 という掟で自主制作しています。 (しょぼくても我慢)
背景CG制作開始 基本的にはMayaやBlenderなどDCCツールで作業を始めるスタイルです。 UE4に持っていく前の「下書き」のような感じでしょうか。 (中にはいきなりUE4上で作り出すものもあります) 地面や壁などモデリングしたり、プリミティブキューブとか置いてみたり、 レベルデザインに近い感覚でザックリと背景を作っていきます。
DCCツール上での仮組み1 プリミティブ主体でザックリ作っていきます。 (軍艦島の場合)
DCCツール上での仮組み2 プロップ等の小物を追加したり、メッシュにディテールを足して情報量を追加していきます。 ロープを張ったり、布を垂らしたり 適時アレンジも加えました。
DCCツール上での仮組み3 大体出来てきたら、UE4へ移行する前段階で一度オフラインレンダリングを行い、 完成イメージを固めます。(モデルアセットのクオリティはあまり望めないので引きの絵で勝負) 草などの植物系はMayaのPaintEffectをPolygonにConvertしたものです。 レンダリングしてみると...
DCCツール上での仮組み4 こうなりました。 基本はどの作品も このノリです。
DCCツール上での仮組み5 たまに想定通りにいかない(気に入らない)事があります。 ホームシアター部屋の形状は当初別でしたが、イマイチな感じがして捨てました。 完成版のホームシアターの部屋は、UE4のみで作成しています。 (画像左:DCCツール上の当初の想定 右:UE4に持ってきたもの)
DCCツール上での仮組み6 DCCツールでの仮組み終了後、順次オブジェクトをfbxでエクスポートします。 シャワールームは楽でしたが、大聖堂の回廊シーンは地味に モデリングが辛かった記憶があります。中でも最高に地獄を極めたのが…、
クルマ UE4には、こっちの ローモデルを使用
クルマのモデリングは完全に地獄の苦行でしたが、 どうしてもクルマのある絵が欲しかったので作りました。
10年以上くらい前には、当時の叡智を結集して キャラモデリングにも挑戦したりしましたが、 難度の高さに加え、一つのモデルに長い時間を割く のが苦痛で、今はやらなくなりました...。 リアル系と デフォルメ系
BSPの活用1 ここからUE4のエディタで作業を 進めます。 背景をUE4上で素早く構築する為に、 場合によってはFBXをImportせず BSPでサクッと終わらせます。 駐車場のシーンでは面倒なので殆ど これで済ませています。
BSPの活用2 1.Modes>Geometry 2.BOXなどをビューポートに入れる。 3.マテリアルをドラッグして アサインする。 4.必要に応じ割りを入れたり Extrudeしたり。 5.テクスチャのタイリング等は Detailメニューから調整する。 6.最後にStaticMeshアセットに Convertして終了。
奴(LightmapUV)はどうなった? LightmapUVは後のライトビルド時に必要なので、 BSPのConvert後にStaticMeshEditor上から、 GenerateLightmapUVのチェックを入れ Apply。 んー、いかにもAutomaticな感じの LightmapUVが生成されますね。 これはNGにしています。
BPSからStaticMeshにConvertした メッシュについては、LightmapUVを DCCツール側で修正。 バラバラになっているLightmapUVを 「面が連続するLightmapUVに修正」 しています。 (※すべては良い焼き上がりのためです) (※Paddingは適時調整しておきます)
モデルは徹底的に使い回す プロップ系は新規に作成するのが面倒なので、毎回使い回して制作速度を上げています。 一度コンテンツブラウザに取り込んだが最後、別プロジェクトでもmigrateしたりして 再利用しています(UE4以前から10年以上使い続けてます) 例:猫と植物
その他・実験的表現 UE4で遠景を表現する実験をした事もあります。 EpicGamesのGDCデモ「Infiltrator」や、SQUARE ENIXの「Agni's Philosophy」 でチラッと出てくる遠くの景色が印象に残っていたので。 (ちなみに海はPlanarReflection置いただけ。自動で水面っぽくなる機能を使用)
作りは至ってシンプルで、 1.HeightmapからLandscape生成して終了 (それっぽく加工したテクスチャを貼っただけでペイントしたりスカルプトはしてません) 2.木のplaneをFoliageToolで配置(今ならGrassToolやProceduralFoliage?) 3.家やヨットなどローポリの遠景用アセットをレイアウトして終了 カメラが近づくと背景としては粗すぎて見られたものではありません。飽くまで遠景作成方法の検証シーンです。 木はBillboardの板ポリしかありません。Imposterでもありません。
その他・芸術的表現 遊びで作った何も考えてない系。 (一応左はAreaLightShadowのテスト、右はAnisotropicSpecularやFurShaderのテストシーン用に作成)
レイアウトの妙な法則 同じ種類のアセットを多く配置する際は、 それが「最低3種類」あると 大量に並べても脳が自然な感じに錯覚する… という説。 (繰り返しだと感じにくい…らしいです)
背景モデル完成(シーン構築まとめ) 1.DCCツール上で予め大体作成しておく 2.既存の自作プロップがある場合は、 別プロジェクトからMigrate 3.床・壁・天井などの基本的な構造物は BSPでサクッと作る 4.LandscapeはHeightMapで一発完了 5.それっぽくレイアウトしておしまい (まぁ自主制作ですから気楽にやりましょう)
●シェーディング シンプルなマテリアルで制作時間を短縮。 自主制作で作成したマテリアルをいくつかご紹介。 umm...
基本は「シンプル・イズ・ベスト」な感じでやってます。 よくUE4を触り始めの頃、ボケーっと何も考えずに 「よーし!今日は何か別の効果を乗せてみるかッ...!ここは乗算だ、それ線形補間だー」 とか適当にマテリアルを組んでたら、
事故りました。 「あれ?なんかどぎつい色になってる!? ん...?色が妙に暗い...?」 以降シンプルでキレイに見せるマテリアル作りを 志しました。 In Loving Memory of 2015年クリスマス、甲州街道
PBR 基本は超シンプルなマテリアル。 エネルギー保存則を意識しつつ、 ・BaseColor ・Roughness ・Metallic の3つに注力し、必要に応じて ・Normal ・Specular を調整。
PBR テクスチャを貼る場合は、PBR (と謳っている)テクスチャを サイトから落として貼ってるだけで すが、Specularは対象の材質によって 布:0.25 岩:0.35 プラスチック:0.49 ... とか適時調整しています。 (0.5固定にはしていません)
PBR テクスチャ非使用でBaseColor値のみ アルミ 鉄 プラスティック FRP ラバー 銅 を想定した検証。 (BaseColor値はPBR関連サイトなどを参照)
PBR 全体の8割くらいは、超シンプルな マテリアルで絵を作っています。 右のシーンの例では、 壁とかBasecolorのみ(0.7~0.8?)、 マットなRoughness値を設定し Metallicは0、NormalMapもなし 床はDiffuseMapテクスチャを貼っただけ。 凝ったマテリアルを作る必要は ありませんでした。簡単かつ高速です。
テクスチャリング なお、ほとんどの自主制作物において、 最大解像度:1024×1024pixel 程度のテクスチャしか使っていません。 理由はTextures.com (https://www.textures.com/) に「フリーのアカウントしか持っていない」 という意識の低さによるものです。 (有料だともっと高解像度のテクスチャが利用可)
ユニークUVを持つモデルをあまり作らないので、最大1Kテクスチャでも何とか誤魔化してます。 テクスチャは特に加工せず、落としたものをそのまま貼ってるだけで Photoshopで描いたりとかしてません。なので当然ながら制作はスピーディです。 画像補正したい場合はUE4の機能を利用してuasset側、もしくはマテリアル側で いじるだけで自主制作的には十分です。 そもそも... テクスチャ自体、貼っていないマテリアルも多いです。 (別にテクスチャフェッチを減らそうとかシェーダ命令数等の負荷を 気にしている訳ではありません)
…と、これだけで終わるのもアレですので、 他に自主制作で検証した事など ・・・。
ParallaxOcclusionMapping POM(ParallaxOcclusionMapping)による視差表現。 よく語られているかと思うので詳細は割愛します。 自主制作では ・HeightLerp使用 ・POM関数使用(BumpOffset不使用) のものを作り、そこから鉱石を表現する亜種を 作成しました。
GemShader 表面はガラス状で、内部に鉱石が 存在しているように見せるシェーダ。 (プールのシーンで使用)
GemShader マテリアル全体像 赤矢印は色収差テスト→ (Not Working)
GemShader 左下:POM部分 右上:もやもやエフェクト効果 右下:表面の質感(視点位置により若干歪む)
GlassShader Refractionは重要視しているので、 少しそれっぽくなるよう作成。
GlassShader おなじみの黄色いテーブルの上に置いてある、 「純正」半透明のガラスマテリアルをカスタムする事から始めました。
GlassShader どんどん訳の分からない屈折シェーダを作成する人になっていきました。
GlassShader 最終的には、 「IORが超高そうに見える謎屈折」 「純正をリッチにした屈折」 の2種類の表現作成で終了という R&D結果に落ち着きました。 あの黄色テーブルに置いてるやつの リッチ版と言っても、ただFresnel 使いまくり、Lerpで補間しまくり みたいな感じです。
WaterShader 水の屈折表現は、マテリアルのRefractionModeを Index Of RefractionからPixel Normal Offset に変更して調整するだけです。 (昔はScreenPositionとか取得して頑張っていた) 十分望む屈折効果が得られたので、最近はこれだけです。 色収差はシェーダ側でやろうと思いましたが、 PostProcess側で薄く掛けちゃったりしてます。
WaterShader 自主制作では必要性無しなので、 FlowMapの処理は行っていません。 「Motion_4WayChaos_Normal」 (EngineContentのMaterialFunction)で 4方向にNormalMapをスクロール させてお茶を濁す事が多いです。 Motion_4WayChaos_Normal プールのシーンでは、上記に加え、 SubUVを水のNormalMapにも使用し、 Causticsの動きと水面の動きを一致 させています。 SubUV
OpaqueTranslucentShader 不透明マテリアルを半透明マテリアルに見せる検証。 マテリアルのBlendModeはOpaque。あとUnlit。 (プールのシーンで検証) 残念ながら完全にフェイクです。 カメラをぐりぐり回して見ると2秒で破綻します。 ただ、カメラをパンする程度なら多少耐えらる場合もある ので「サイドビュー視点のゲームやカットシーン等で活用 できれば...!」という感じですね。
OpaqueTranslucentShader ・背景スクショ画像にScreenPositionを接続(A) ・ピクセル法線をワールド空間からカメラ空間に変換、それにフレネル(屈折表現)を追加(B) AとBをSubtractして完成。 当時これの参考になる手法を ネットで見かけたのでテストしたものです
AnisotropicSpecular 異方性鏡面反射。 AV機器のボリュームなどの各種つまみに適用。 テクスチャを使い何とか表現したフェイク手法。
AnisotropicSpecular 当時、DeferredLightingゆえにLightVectorが うまく取得できなかった?ので、こうしました。 色々と資料等調べてたのですが忘れました。 当時サンプルか何かを参考に、シーンの光源位置/回転 などを取得しMPCのVector値にsetするConstructionScript を組んで悩んでいた記憶しかありません。
板ポリRayMarch 島のシーンでは、ビルボードのPlaneメッシュに RayMarchHeightmap関数を使ったマテリアルを、テストで 空の表現に組み込みました(ビルボードもシェーダ処理)。 ボリュームの雲表現で話題のRayMarchですが、 島のシーンは遠景専用のつもりで制作したので、 雲までまさかのビルボードにしました。
BRDF ちなみに、動的ライトに照らされるような状況だと DiffuseBRDFの再考機運が俄然高まります。以下うろ覚え 昔触ったときは、仮にShadermodel.ush?(usf?) のような名前のファイルの中でOrenNayarを検索してみる ↓ コメントアウトされてただけで存在してた。なので変更してみる。 ...というノリで試しました。 Microfacet的にDiffuseRoughnessがザラザラなOrenNayarが 昔から好みでした(SpecularだとCook-Torranceが好み)。 SpecularBRDFのほうはGGX以外に変更したり する検証は特にしていません。
その他 ・Tri-Planer with WorldAlignedBlend系絡ませ ・ぶっさし馴染ませPixelDepthOffset with DistanceFields ・FurShader Using Shell Method (4層) ・軟体シェーダ(SoftBody) ...and More. 最後に、 ReflectionProbeを適正に対応して シェーディング作業は終了。
●ライティング/レンダリング 最重要行程。 mumumu...!
はじめに ライティングは知識もセンスも必要で難しいのですが 非常に重要視しています。 普段は動的ライトに動的シャドウイングな ライティング環境まわりの仕事に関わる事が多い のですが、今回のArtDiveについてはすべて 「静的ライト」 のライティングに的を絞ってお話しします。
そもそも かつてGI(GlobalIllumination)を テクスチャにベイクする事に情熱を 傾けていた時期がありました。 (PS3/XBOX360が登場してまだ間もない時期) テクスチャベイクしようとしていたGIは、 Mental-Ray For Mayaを用いて光源から Photonをキャストし、FinalGathering を併用しつつレンダリングしたりする、 PhotonMapping方式のアレです。
そもそも PRT(PrecomputedRadianceTransfer)法の 論文をベースに、 「これを近似した手法をMRで行い、全部焼いて ゲームエンジンに乗っけてリアルタイムGI やろう」 的な事を某内製エンジンと共に研究してました。 末期症状では屈折や回折まで焼いてました。 (当時のミラーズエッジというゲームの影響も大) かつて目指していたものをUE4のLightmassが 実現していたので、EpicGamesに対しては 尊敬の念と共に親近感に似た何かを感じます。
事前準備その1 まずはコーネルボックス自作から! (無視していただいて大丈夫です) (ただ、これを作ると間接光強度やカラー ブリーディング、コースティクス等の 参考になります)
事前準備その2 そして UE4でもコーネルボックスを作成! 更には、
事前準備その3 UE4にSponzaを移植! Sponza宮殿のモデル (Sponza Atrium)はCRYTEKの 公式サイトで配布されていました。 (今は知りません)
事前準備その4 最高の二次三次的拡散反射! ナイスカラーブリーディング!! 間接光に加え間接影の確認にも 最適の、圧倒的な神背景モデル。
ちなみに、クロアチアのドゥブロヴニク旧市街に 本物のスポンザ宮殿はありますが、すぐ近くに 「レクター宮殿」もあり、そちらも最高です。 (形状が少し違う。階段なども追加されてる) (画像はそのオマージュ(非UE4作品))
事前準備その5 【StudioLightingScene】 簡単にこういうのも作っておくと良いかと。 静的ライティングのテストシーン。 3点照明(ThreePointedLighting) ・キーライト ・フィルライト ・リムライト の3つをレフ板に当ててライティング。
事前準備その6 【AdvancedLighting &HDRIBackdrop】 エンジン側で提供されています。 動的ライティングのテストシーンとして有益。 (UE4向けに自主制作した唯一のキャラ、ちょうちょ)
…と、ライティング事前準備はまだ続きます。 次はライティングに入る前のテンプレ環境作りです。 ・・・。
Sunny16RuleBasedLighting ライティングの基準について ・適正露光3.14lxベース ・リアル照度値ベース
Sunny16RuleBasedLighting Sunny16Ruleとは? 照度計等を使用せずに正しい(と思われる)昼光露出を近似する方法。 https://en.wikipedia.org/wiki/Sunny_16_rule 晴れや曇り設定の環境テンプレート。 UE4でライトを調整する前に 個人的に行っている設定方法です。 (ルクス(LUX)はlxと表記)
適正露光量ベース PostProcessVolumeを追加。Sunny16Ruleの「晴れ」は、 PostProcessSettings > Camera ShutterSpeed:100(128) ISO:100 F-stop:16 となります。 Exposure > Metering Mode はManualに変更しておきます。 EVGuideを参考に、晴れはEV15とします。
次に、DirectionalLightとSkyLightを追加。 DirectionalLightのIntensity:3.14(π(≒3.141593) )に設定。 SkyLightには適切な任意のHDRIを貼る。 (SkyLightはHDRI(輝度は画像次第)を使うので、実際にSkyLightに入力するIntensityは計測結果を元に入力) HDRIには太陽が映っていない、また映っている場合はPhotoshop等で予め太陽を除去して おきます。太陽は高輝度な為にIBLに望ましくない影響が出る恐れがありそうです。 【πの根拠→Epicブログ】 テンプレートのライティングの更新 https://www.unrealengine.com/ja/blog/updated-lighting-in-templates?sessionInvalidated=true
Sunny16Ruleを3.14lxでやると、真っ暗に。 本来のSunny16Ruleは10万ルクスとかのリアル照度ベースで有効な手法。 現実世界の晴れの照度が3.14ルクスしかないと闇のように見えるのは当然かも。 なのでEVCompensationにカウンターEVを当てます。 EVCompensation(露出補正)
PostProcessのExposure > EVCompensation Sunny16Ruleの晴れ(ShutterSpeed:100/ISO:100/F:16)を、露出値の定義に当てはめると、 Exposure Value (wikipedia) https://en.wikipedia.org/wiki/Exposure_value EV=Log2(16^2*100) 14.64385 となる(15よりちょっと低い)
EV14.64385をEVCompensationに当てはめる 無事明るくなる。
次にSkyLight(HDRI使用)のIntensityを計測。 計測時にはGIをオフにして太陽光と環境光のみの状態にします。 ForceNoPrecomputedLightingのチェックを入れてビルドしておくか、 showメニューからGlobalIlluminationを非表示にする。 次に、PixelInspectorを表示します。 [Material] Basecolor:1 Specular:0 反射率1のマテリアルはPixelInspectorでも概ね同じ1である事を確認します。 次にSkyLightのIntensityを調整して約0.25位の輝度になるよう調整(比率4:1)
これまでの設定で、 Viewport > Exposure > GameSettings のチェックをオンオフ。どちらも明るさが一致します。 ColorTemparatureは快晴に合わせ適時調整して終了。 (8,000k~12,000kなど) これをテンプレートの一つとしています。
そもそもカウンター当てるのはいかがなものか? Camera設定の値は内部的にEV値をいじっているだけ(らしい)。 ShutterSpeed:1 ISO:100 F-stop:1 と入力し、 EVCompensation:0 とする手もあります。(これだとSunny16Ruleからは外れます)
リアル照度値ベース r.UsePreExposure を有効にします(事前露光)。 ProjectSettingsだと右の画像の Apply Pre-exposureナンタラです。 (なんかコレUE4.23からデフォルトで有効になってますね…)
例:晴天 約100,000 lxと仮定した場合 太陽光 約80,000 lx DirectionalLight Intensity(4) 環境光 約20,000 lx SkyLight Intensity(1) というデカい値をライトのIntensityに入力していきます(SkyLightの値入力は計測後)。 今度はPixelInspectorでの計測結果もデカい輝度値になってきます。手法は先ほどと同様です。
リアル値ベースこそが真のSunny16なので、PostProcessのEVCompensationは0のままでOK。 ここでもSunny16Ruleに従い、ShutterSpeedは100/ISOは100/F-stopは16 ViewportのExposure > EV100に値を入れる場合は 先ほどのLog2(16^2*100)=14.643856を。 【追記】UE4.24のSunSkyというBP内にある、 DirectionalLightComponentのIntensityがデフォルトで 75,000luxに。リアル値の時代が来つつあるかも知れません...。
最近の自主制作では、上記の方法をテンプレートとして ライティング調整のベースとしています。 あくまで個人的な見解で、間違いが多分に含まれている可能性が高いです。 某UE4フォーラムでも数年掛かりで 議論されているようです (PhysicalLight)。 リアル値ベースのライティングによる 自主制作作品はまだ出来てないですが、 右の画像はテストしてたものなので これを発展させて何か絵を作ります。 ちょっと前のツイートにもあります→
MeasuringBasedIndoorLighting 続いて屋内の、計測ベース屋内ライティング。 以前、こんなツイートを→ このツイートを補足すると、 床の照度→照度計で計測 距離→メジャーで図る(天井高2.8m) 照射角→LED電球に記載あり EVなど→各種ガイドを参考。この場合7くらい ルーメンの割り出しは便利な計算サイトを利用
MeasuringBasedIndoorLighting 屋内ライティング環境の再現検証については、 以前照度計を使ってテストしました。 HP-881Dという機種を使用。 ネット通販で2000円くらいで購入。
MeasuringBasedIndoorLighting 検証したかった事は出来たので、自主制作の絵としては(下の画像右)未完で終わってます。 ちなみに生成されるLightProbe(SH)あたりも気になるところが、VolumetricLightmap方式でやっているせいか、 検証時に動的オブジェクトの具合に問題が起きることはありませんでした。
長らく準備やらテンプレやらでガチャガチャやってきましたが、 この後は普通にライトを調整したりしてライティングします。 nageeeeeeeeeeyo!!!
ライティング作業着手 大前提としてまず間接光を意識する必要がありますので、「ここが暗いなぁ...」と思っても、 本来光源がない場所に安易にポンポンと直接光を追加するのは絶対にNG、 という認識で行っています。 (要は現実世界を真似してるだけです) 上記に加え以下の方法もよく使います。 ・IES ・レフ板 ・ジオメトリライト
IESファイルによるライティング ・IES(配光照明データ)ファイルの作成 Mental-Rayノードに*.ies形式のファイルを適用してレンダリングするために IESGeneratorなどを昔から利用していたので、今でも同じノリで使ってます。 (10年前に個人的にIESが大流行しました) 生成したIESファイルはコンテンツブラウザにImportしてテクスチャ化。 または、照明機器メーカーの サイトからiesファイルを ダウンロードします。
IESファイルの適用 テクスチャアセットにしたIESを光源に適用。 建築CGっぽいテイストのシーンには、 積極的にIESを活用しています。
レフ板ライティング レフ板想定のメッシュにSpotLightを当てて光 を返し、対象物をライティングする場合もあります。 面光源の代わりとして重宝していましたが、 現在はSkyLightのMultipleBounce化および、 RectLightの登場で今後は活用機会が減るかも しれません。 ホームシアターのシーンでは環境光(窓からの大気散乱光) 表現における主力の役割を担っていました。 SkyLightがMultiBounce化したのは、SkyLight自体もライト ビルド時にPhotonをキャストするようになったから?
LightmassPortal LightmassPortalの配置も おまじない程度に行っています。 これによりある程度光が回り込んで入って くるような効果が得られました。 ホームシアターのシーンでは正直あっても なくてもよかったのですが、一応 LightmassPortalを配置してライトビルドし、 明るい室内表現に貢献して頂いてます。 このシーンでの窓からの環境光の主力は 明らかに「レフ板」によるものです。 配置して焼くだけというやや地味な事もあり、詳細なLightmassPortalの検証結果については割愛します。
もちろんLightmassImportanceVolumeも 適切に配置しておきます。 ・Photonの範囲 ・配置しなくてライトビルドは可能ですが、 ザルな品質だよ...とlogにwarningで教えてくれます。
BaseLightmass.ini Lightmassでライトビルドする前に、必要に応じてBaseLightmass.iniファイルを 自分好みに調整しています。 PhotonやShadowRayまわりを多少リッチになるような設定にした程度です。 (ホームシアター他、一部のシーンで実行。殆どはデフォルトのProductionQualityで十分)
GlobalIllumination GIの調整はじっくりやりましょう。ここが一番CGを楽しめるところです。 IndirectLightingIntensityは1を基準に調整。
カラーブリーディング CornellBoxやSponzaで、「最高のカラーブリーディング」を生み出す練習をします。 Light側のIndirectLightingIntensityでの調整が基本で、最終的にPostProcessで微調整。 個別DiffuseBoost(Actor単位) 全体DiffuseBoost(World単位) を調整して、「芸術的な最高のカラーブリーディング」も素晴らしいかと。 画像:入射光角度の違いによるカラーブリーディングの遷移
ジオメトリライト UseEmissiveForStaticLighting もよくライティング時に利用します。 Emissive成分を持つオブジェクトを光源化。 (ライトを配置せずに済む)
LightmapDensity クオリティ重視で十分な品質を担保できそうなLightmapResolutionを設定します。 建築CG系は精度が求められるので、かなり高解像度(Density表示:オレンジから赤)。 自然物などオーガニック背景は低解像度(青から黄緑) ・SponzaやCornellBoxは、大体右の画像くらい の解像度の密度感です(Density表示:緑前後) ・CastStaticShadowのベイク結果で 解像感が弱い場合はもう少し上げます。
LightmassSettings デフォルト設定+α程度の調整に留める事が多いです。 ・ホームシアターではStaticLightingLevelScaleを 0.1まで落としたりしました(ライトビルド時間は増大) ・IndirectLightやSkyLightのバウンス回数は、以前のオフ ラインレンダリングの経験則から3~5回程度で十分と判断 (エネルギー減少率を考慮するとそれ以上の回数は効果薄い?) ・EnvironmentColorは使っていません。 ・UseAmbientOcclusionは静的ライトシーンにおいてよく 活用します。その際OcclusionExponentがデフォルト値 だとは妙に濃く出てしまう傾向がある為、ここは低めで運用。 ・CompressLightmapsは建築CGっぽい作品だとオフに設定。
ライトビルド ライティング調整中はPreviewで焼きます。計算時間が他と比べて段違いに早いです。 自主制作のように影も焼いている場合はPreviewだとボケボケになりますが、 一旦そこは気にせず、全体的な雰囲気確認で高速なイテレーションを重視します。 調整中の段階でライトビルド結果を待つのに毎回何時間も掛けるのは、さすがに生産性に欠けますね。 ・ライティング調整がFIXしたら満を持してProductionでじっくり焼きます。 必要に応じてBaseLightmass.iniも調整しておく Lightmassは、「選択した範囲だけ部分的に焼ける」 とかの機能があると個人的に有り難いですね。
ライティングの仕上がり ・ムラはないか? ・オブジェクトのぶっさし面で変になってないか? ・直接光と間接光の割合等は適正か? ・影などの解像感は十分か? ・カラーブリーディングに悔いは無いか? LightmapUVにOverlapping等の Warningが出ている場合は速やかに 修正します。 モデルのぶっさしは極力やらない ように、レイアウト時に気を付けて います。
ライティング/レンダリングまとめ ・コーネルボックスを自作しUE4で再現。Sponza宮殿でも楽しむ。 ・Sunny16Ruleでライティングのテンプレを用意。 ・Lightmass調整時は低品質で行い、イテレーションを高速に。 ・必要に応じレフ板ライティングなど小技を使う。 ・調整後、最後のライトビルドは高品質設定で行う。
その他 CausticsやFog、色々なGIなど。
AtmosphericFog/HeightFog 空気遠近法的にも重要な大気表現ですが、これといって複雑な事はしていません。 HeightFogにVolumetricな効果が表現可能になった時にVolumetricFogを多少試した程度です。 (シャワールームの照明を落としてVolumetricFogの初テストした時の画像)
Causticsについて 物体を透過する光が屈折により 集光する現象。 集光模様エフェクト。
静的Caustics UE4でもやりました。Mental-Rayでのオフラインレンダリングで計算し、 その結果をテクスチャにベイク→それをUE4のマテリアルに乗せる。 ただそれだけです。
静的Caustics CausticsはEffectもPhotonも美しいので 実にテンション上がります。 (Lightmassでも簡単にこれが表現できる日が来るといいですね)
静的Caustics 事前計算系だとCausticsをVolume化したりプリズム化 するのも楽しいです(使いどころは全く不明) いつかUE4上でも再現してみたいと思います。
動的Caustics リアルタイムで動かす動的な集光。 プールのシーンの場合。 作成方法 ・連番テクスチャを作成 ・SubUVマテリアル関数を使用 (Flipbookは未使用) ・LightFunctionマテリアルまたは 通常のマテリアルに組み込む。 ・とにかくpannerで複数のテクス チャをスクロールさせる旧態依然 とした方法から脱却したかった
動的Caustics 連番のコースティクステクスチャを使用。 DCCツールでレンダリングしようと思いましたが、UE4での検証作業より素材作りのほうで 時間掛かりそうだったので、「CausticsGenerator」で生成。 フリー版(機能制限アリ)を使用。商用利用には有料版をどうぞ。
動的Caustics 作成した連番テクスチャ。 (6×6=36枚をアトラス化)
動的Caustics 作成したマテリアル。 SubUVを使用しました。 似た関数でFlipbookがありま すが、今回は見送り。
動的Caustics テクスチャシームの問題が 発生しましたが、Epicの RyanBrucksさんのブログ で解決。 【Shader Bits】 https://shaderbits.com/blog
他のGIソリューション UE4で試したものを簡単に紹介。
GPULightmass GIメソッドがPhotonMappingではなく Radiosityのようです。 CPUではなくGPUでPrecomputeする模様。 (実はあまり検証出来てない)
VXGI2.0(UE4.19) NVIDIAのリアルタイムGI。 GitHubで入手しビルド。 素晴らしい間接光 素晴らしい面光源 素晴らしいGPU負荷増大
DFGI Distance Field Global Illumination. UE4.8でテスト。 精度的には粗い感じがしましたが、 元気で強気なカラーブリーディングを見せてくれます。
SSGI UE4.22でテスト。 画像は r.SSGI.Quality 5 にしたもの。 AOは実にキレイですね。
Lightmass ProbeGI いつの間にかLightmassでLightmapを使わない(と思われる)「LightProbeのみのGI」が UE4で可能になりましたね!正直ちょっと感動しました。 ただ精度にやや難ありで、画像ではVolumetricLightmapDetailCellSizeをかなり小さめに設定。今後も調査継続します。
その他 ・Enlighten 初めて出会ったのは2008年頃。色々思い入れがあります。 ・レイトレGI 自主制作の絵はありませんが、お仕事では試しています。 ・LPV 永遠のExperimental. 昔と比べPostProcess側の詳細設定で頑張れるようになりましたが、 やはり精度にやや難が...。
●エフェクト oh...
気持ち程度 雰囲気出しの為に以下のエフェクトを何となくの感じで作成。丁寧に作れた訳ではありません。 今後は折を見てNiagaraに挑戦したいと思います。 ・煙 ・雨 ・雪 ・泡 ・火花 ・蛍
●ポストプロセス yeah...
事前準備1 ・SSAOは基本切る方向 その代わり(と言ってはなんですが)AOはLightmassでうっすら焼いてます。 SSGIやDFAO、レイトレAOのAOはきれいなので個人的にめっちゃアリだと思います。 作業開始前にPostProcessSettingsで0にして無効にします。 ・AmbientCubemapは使用しない テクスチャの利用により、いわゆるAmbientLight的な 「明るさが定数的に持ち上がってしまう」のは緩和されますが、 シェーダに及ぶ負の影響や間接光を大事にしたいので無しです。
事前準備2 ToneMapperのパラメータを、UE4.15以前のACESカラースペース適用前に戻す。 【カラー グレーディング Filmic トーンマッパ】 https://docs.unrealengine.com/ja/Engine/Rendering/PostProcessEffects/ColorGrading/index.html デフォルトのACESだと暗部が黒潰れして 見えるので、カラーグレーディングの 調整前にはあまり好ましく思っていない為 に戻しています。
ColorGrading 感性の赴くままに芸術的アプローチで調整。 特にわちゃわちゃやりません。 WhiteBalanceやContrast等をちょっとだけ。 8bitのLUTテクスチャは使用していません。
PostProcessMaterial モザイクとか面白い効果が 生み出せるので結構好きです。 作成したPostProcessMaterial の数自体は多くないですが、 自主制作で活用しています。
PostProcessMaterial 水中のもやもや、蜃気楼、水滴... 色々と活用効果はありました。 (こちらはごくオーソドックスな感じのマテリアルなので作り方等の詳細は割愛)
CustomDepth/CustomStencil レンダーパスのCustomDepthを利用すると結構面白い効果が得られます。 映画シンドラーのリストで言うところの「赤い服の少女」みたいな表現が簡単に 出来そうですね(シンドラーのリストで画像検索) 画像はクルマのにだけRenderCustomDepthPass を適用したもの。 CustomStencilも試してはいますが、 作品には使用していないので割愛します。 ちなみにCustomDepth/CustomStencil共に、 profilegpuで見ると負荷は別途かかる模様。
CustomDepth/CustomStencil 大聖堂の回廊ではモノクロ表現に挑戦したのですが、彩度はPostProcessSettingsに よるものではなく、この画像のPostProcessMaterialで行っています。 (Lerp使用、If文不使用)
CustomDepth/CustomStencil ここでモザイクを使用。OneMinusで効果を反転後、中途半端な結果になる場合は Ceilで切り上げ。ナンバープレートだけにモザイクをかける...といった感じです。 この画像の背景に掛けたDesaturationはちょっと 弱めてます。
DirtMask これと言った事ではないのですが、 こういうスクラッチなテクスチャを 貼って絵の雰囲気出しに利用しました。 (大聖堂・回廊シーン)
BluePrint 仕事上、たまにやる事があるのですが、 自主制作ではあまりBPを組んだりしていません。 ただ、ホームシアターではPIE時の動画 再生処理、サウンドの制御や音の減衰 等々はBPでやりました。 サウンドのオブジェクトベースオーディオ化 (5.1.2chなど)の部分はUE4で鳴らす為の .wavのソースを、AVアンプ側でデコードして DTS:Vurtual Xなどで出力。 あと、スピーカーケーブルは BPのSplineMeshでのループ配置です。
すべて完成!
その他
制作時にこだわりたい部分 Reflection Refraction Caustics GlobalIllumination(Lighting) 引きの絵意識
制作時に気をつけている部分 [Reflection] 意図通りに出ているかどうか SkyLight IBL LowerHemisphere ReflectionProbe SSR r.ReflectionEnvironment 部分の真っ黒化に要注意!
特記事項(絵作りだけの自主制作あるある) ・Collisionなし ・LODなし ・そもそも描画負荷を気にしていない(プロファイリングもしてない)。 ・r.Streaming.PoolSizeとか好きにいじる (スケーラビリティを自分好みに変更する) ・テクスチャのmipmapを無効にしたりBias掛けたりする ・平気でLightmapTextureを非圧縮にしたりする ・お仕事じゃないので基本的にデータが雑 もちろんゲーム開発では御法度ですね...。。
最適化 特にしてません。せっかくなので感想など。 ・StaticLightのシーンはやはり軽い。 CascadeShadowMapやPerObjectShadowの事を考えなくていい。 ・PlanarReflectionを重ねた時のソートがおかしかった。 プライオリティの設定で解決出来ず、結局分割した。 ・ライティング調整時のライトリーク問題の対応は行った。 ・ライトビルドのコストパフォーマンスは要検討。 ホームシアターシーンでのSLLS0.1はやりすぎました。 ライトビルドは一晩経過しても終わらなかった。 ・Paniniが惜しかった!ボケなければシャワールームで使ってました。 ・UE4の進化にはいつもワクワクさせてもらってます!
参考 ●Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, Low-Frequency Lighting Environments. https://sites.fas.harvard.edu/~cs278/papers/prt.pdf ●テンプレートのライティングの更新 https://www.unrealengine.com/ja/blog/updated-lighting-in-templates?sessionInvalidated=true ●Shader Bits https://shaderbits.com/blog ●ライティング & レンダリング 謝辞 株式会社けだまワークス 河崎 幸治(けだまじごく)
FAQ ご質問ありましたら。CG以外の事でも結構です。
ご清聴ありがとうございました