UE4にはシーンを美しくしたい、軽くしたいという時
その要望を叶えてくれるLightmassと呼ばれるライトマップビルドシステムがあります。
https://docs.unrealengine.com/ja/RenderingAndGraphics/Lightmass/index.html
背景などをクォリティアップする際、皆様このLightmassにとてもとてもお世話になるかと思うのですが、
先日このような疑問がツイッターに投稿されました。
https://twitter.com/kurosaurus/status/1332297754048008192?s=20
はい、僕も気になります。
というわけで、上記ツイートにはすでにお答えさせて頂いてるのですが
今回はさらにもう少しその詳細を書かせて頂こうかと思います。
(確認環境はUE4.26.0です。)
##ということで答えから
これらがLightmassで挙動が変わるマテリアルノードたちです。
これらのノードは、ライトビルドの際に変な値が入らないように、
固定値が設定されたり挙動しなくなったりします。
(例えばCameraVectorノードはライトビルド時のカメラってなに…?となるので固定値が入るようになってるのかなと思います。)
ちなみにそれぞれのノードに入る固定値は以下です。
(重要そうなノードを太字にしています。)
ノード名 | 値 |
---|---|
ParticleRelativeTime | 0 |
ParticleMotionBlurFade | 1 |
ParticleRandom | 0 |
ParticleDirection | (0,0,0) |
ParticleSpeed | 0 |
ParticleSize | (0,0) |
WorldPosition | (0,0,0) |
ObjectPosition | (0,0,0) |
ObjectRadius | 500 |
ObjectBounds | (0,0,0) |
PreSkinnedLocalBounds | (0,0,0) |
DistanceCullFade | 1 |
ActorPosition | (0,0,0) |
CameraVector | (0,0,1) |
LightVector | (1,0,0) |
ReflectionVector | (0,0,-1) |
ReflectionAboutCustomWorldNormal | (0,0,-1) |
VertexColor | (1,1,1,1) |
PreSkinVertexOffset | (0,0,0) |
PostSkinVertexOffset | (0,0,0) |
PreSkinnedPosition | (0,0,0) |
PreSkinnedNormal | (0,0,1) |
Time | 0 |
DecalLifetimeOpacity | 0 |
また、これらはどこで設定されているかと言うと、
Engine\Source\Editor\UnrealEd\Private\Lightmass\LightmassRender.cppにて、
各ノードがoverrideされております。
実際にソースを確認したい方はこちらをご確認頂けましたら幸いです。
(実際には上記以外にももうちょっと多くのノードの挙動が変わるのですが、今回は明示的にOverrideされているものだけご紹介ということで……)
##陥りがちな罠
さて、これらの仕様、ライトビルドの際上記のノードを使わず、
シンプルなマテリアルでビルドする限りは特に問題になりません。
しかし例えば以下のシーン。
ベクター値で直接カラー設定したものは適切にGIがベイクされていますが……、
VertexColorノードでカラー指定すると、
(1,1,1,1)の真っ白の固定値にされてしまう為、GIが正しくベイクされなくなってしまいます。
Vertex Colorは直接色を設定するだけでなく、
以下のようなレイヤードマテリアルなどでも使用される事が多いと思いますので気をつける必要がありますね。
また、テクスチャをシームレスに貼る為にWorldPositionノードなどを使用している場合も要注意です。
WorldPositionは**(0,0,0)の固定値になる為、
ライトビルド時にテクスチャサンプルが正しく行われなくなってしまいます。
(同じ理由でWorld Aligned系のノードも正しく挙動しません。)
質問にもあったTimeノードも気になりますね。
こちらも0固定ですので、時間によって色が大きく変わるものは危険です。
他にもFresnelやParallax、BumpOffsetなどで使用されているCameraVectorノード**、こちらは**(0,0,1)固定です。
以前別の記事を書かせて頂いた汎用性の高いObjectPositionノードとActorPositionノード**、
こちらは**(0,0,0)固定**。
https://qiita.com/EGJ-Osamu_Saito/items/502c4f8adc55737072d4
ActorPositionノードなどは汎用性の高さから、
以下のような感じで位置に応じて色を変えるなどしたりするかと思うのですが、
GIが適切にベイクされなくなる点には気をつける必要がありそうです。
さらにはObjectBoundsノードは**(0,0,0)なのに
ObjectRadiusノードは500**と謎の値が入っているのも要注意ですね。
##対応方法
という感じで、UE4はライトビルド時思いも寄らないマテリアルの結果になってしまうことがあります。
しかしご安心下さい。UE4は対応方法もご提供しております。
それがLightmassReplaceノードです。
こちらを使うと、Lightmassの時にだけ使用されるようにマテリアルの処理を分岐することが可能です。
https://docs.unrealengine.com/ja/RenderingAndGraphics/Materials/ExpressionReference/Utility/index.html
https://christinayan01.jp/architecture/archives/7662
これまでに挙げたLightmassで挙動が変わるマテリアルノードたちを使って複雑なマテリアルを作っている場合は、
上画像のようにLightmassReplaceノードを使用して適宜処理を分けて頂けたらと思います。
(GIの効きが悪いからちょっと色をブーストする、なんてことも可能です。)
##補足
ちなみのこれらの挙動、
UE4.26よりベータ機能として提供されているGPULightmassにおいては大きく改善されております。
以下のRoadmapにもあるように、GPULightmassはレイトレをベースにライトビルドを行う為、
VertexColorなどCPULightmassで無視されてきたノードの多くが問題なく挙動します。
(全てではありません。Timeノードとかは変わらず0固定です。)
https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/c/192-gpu-lightmass-beta
つまりどういうことかというと、CPULightmassで問題となっていた、
VertexColorノードや、
WorldPositionノード、
ObjectPositionノードやActorPositionノードなども、
全て問題なく挙動します。素晴らしいですね!
詳細が気になる方は、GPULightmassで使用されているシェーダーは、
以下の辺りにありますので、こちらをご確認頂けたらと思います。
Engine\Plugins\Experimental\GPULightmass\Shaders
また、GPULightmassで使用されているシェーダーには以下のようなコメントもあり、
将来的にはワールドポジションオフセットもサポートされるかもしれません。
設置感改善やバリエーション出し、シャドウリーク回避の為に頂点オフセットしたいけど、CPULightmassで正しくベイクできない……というオブジェクトもGPULightmassでは問題なくなるかもしれませんね。
(ちなみにCPULightmassではベイク時にLOD0が使われる仕様を利用して、ベイク軽量化や、シャドウリーク回避を行う若干ハッキーな方法があります。)
https://www2.slideshare.net/EpicGamesJapan/ue4-139190804
最後に、一点気をつけるべき点としまして、
GPULightmassではLightmassReplaceノードは使用できません。
もしGPULightmassでベイク結果を調整したい場合はRayTracingQualitySwitchReplaceノードを使う必要があります。
(このノードはライトベイク時だけではなく通常のレイトレ描画にも影響しますのでご注意下さい。)
現時点では上記の状況に加え、CPULightmassで使用できていた一部のパラメーターがGPULightmassでは効かないなど、
CPULightmassとGPULightmassは全く同一の結果とはならない点を気をつける必要があるのですが、
(DiffuseBoostやUse Emissive for Static Lightingなどが挙動しません)
速度面や利便性という点でGPULightmassは非常に便利かと思いますので、
ケースバイケースで運用して頂けましたら幸いです。
それでは皆様楽しいLightmassライフを!