12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Unreal Engine 4 (UE4) その3Advent Calendar 2020

Day 23

[UE4]Lightmassで挙動が変わるマテリアルノードたち

Last updated at Posted at 2020-12-22

UE4にはシーンを美しくしたい、軽くしたいという時
その要望を叶えてくれるLightmassと呼ばれるライトマップビルドシステムがあります。
https://docs.unrealengine.com/ja/RenderingAndGraphics/Lightmass/index.html
image.png

背景などをクォリティアップする際、皆様このLightmassにとてもとてもお世話になるかと思うのですが、
先日このような疑問がツイッターに投稿されました。
https://twitter.com/kurosaurus/status/1332297754048008192?s=20
image.png

はい、僕も気になります。
というわけで、上記ツイートにはすでにお答えさせて頂いてるのですが
今回はさらにもう少しその詳細を書かせて頂こうかと思います。
(確認環境はUE4.26.0です。)

##ということで答えから
これらがLightmassで挙動が変わるマテリアルノードたちです。
image.png
これらのノードは、ライトビルドの際に変な値が入らないように、
固定値が設定されたり挙動しなくなったりします。
(例えば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されております。
実際にソースを確認したい方はこちらをご確認頂けましたら幸いです。
image.png
(実際には上記以外にももうちょっと多くのノードの挙動が変わるのですが、今回は明示的にOverrideされているものだけご紹介ということで……)

##陥りがちな罠
さて、これらの仕様、ライトビルドの際上記のノードを使わず、
シンプルなマテリアルでビルドする限りは特に問題になりません。

しかし例えば以下のシーン。
ベクター値で直接カラー設定したものは適切にGIがベイクされていますが……、
image.png
image.png

VertexColorノードでカラー指定すると、
(1,1,1,1)の真っ白の固定値にされてしまう為、GIが正しくベイクされなくなってしまいます。
image.png
image.png
Vertex Colorは直接色を設定するだけでなく、
以下のようなレイヤードマテリアルなどでも使用される事が多いと思いますので気をつける必要がありますね。
image.png
image.png
また、テクスチャをシームレスに貼る為にWorldPositionノードなどを使用している場合も要注意です。
image.png
WorldPositionは**(0,0,0)の固定値になる為、
ライトビルド時にテクスチャサンプルが正しく行われなくなってしまいます。
(同じ理由でWorld Aligned系のノードも正しく挙動しません。)
image.png
質問にもあった
Timeノードも気になりますね。
こちらも
0固定ですので、時間によって色が大きく変わるものは危険です。
image.png
他にもFresnelやParallax、BumpOffsetなどで使用されている
CameraVectorノード**、こちらは**(0,0,1)固定です。
image.png
以前別の記事を書かせて頂いた汎用性の高い
ObjectPositionノードActorPositionノード**、
こちらは**(0,0,0)固定**。
https://qiita.com/EGJ-Osamu_Saito/items/502c4f8adc55737072d4
image.png
ActorPositionノードなどは汎用性の高さから、
以下のような感じで位置に応じて色を変えるなどしたりするかと思うのですが、
GIが適切にベイクされなくなる点には気をつける必要がありそうです。
image.png
image.png
さらにはObjectBoundsノードは**(0,0,0)なのに
ObjectRadiusノードは
500**と謎の値が入っているのも要注意ですね。
image.png
##対応方法
という感じで、UE4はライトビルド時思いも寄らないマテリアルの結果になってしまうことがあります。
しかしご安心下さい。UE4は対応方法もご提供しております。

それがLightmassReplaceノードです。
image.png
こちらを使うと、Lightmassの時にだけ使用されるようにマテリアルの処理を分岐することが可能です。
https://docs.unrealengine.com/ja/RenderingAndGraphics/Materials/ExpressionReference/Utility/index.html
https://christinayan01.jp/architecture/archives/7662
image.png
これまでに挙げたLightmassで挙動が変わるマテリアルノードたちを使って複雑なマテリアルを作っている場合は、
上画像のようにLightmassReplaceノードを使用して適宜処理を分けて頂けたらと思います。
(GIの効きが悪いからちょっと色をブーストする、なんてことも可能です。)
##補足
ちなみのこれらの挙動、
UE4.26よりベータ機能として提供されているGPULightmassにおいては大きく改善されております。
gpul.gif
以下のRoadmapにもあるように、GPULightmassはレイトレをベースにライトビルドを行う為、
VertexColorなどCPULightmassで無視されてきたノードの多くが問題なく挙動します。
(全てではありません。Timeノードとかは変わらず0固定です。)
https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/c/192-gpu-lightmass-beta
image.png

つまりどういうことかというと、CPULightmassで問題となっていた、
VertexColorノードや、
image.png
WorldPositionノード
image.png
ObjectPositionノードActorPositionノードなども、
image.png
全て問題なく挙動します。素晴らしいですね!

詳細が気になる方は、GPULightmassで使用されているシェーダーは、
以下の辺りにありますので、こちらをご確認頂けたらと思います。
Engine\Plugins\Experimental\GPULightmass\Shaders

また、GPULightmassで使用されているシェーダーには以下のようなコメントもあり、
将来的にはワールドポジションオフセットもサポートされるかもしれません。
image.png
設置感改善やバリエーション出し、シャドウリーク回避の為に頂点オフセットしたいけど、CPULightmassで正しくベイクできない……というオブジェクトもGPULightmassでは問題なくなるかもしれませんね。
(ちなみにCPULightmassではベイク時にLOD0が使われる仕様を利用して、ベイク軽量化や、シャドウリーク回避を行う若干ハッキーな方法があります。)
https://www2.slideshare.net/EpicGamesJapan/ue4-139190804
image.png
最後に、一点気をつけるべき点としまして、
GPULightmassではLightmassReplaceノードは使用できません。
もしGPULightmassでベイク結果を調整したい場合はRayTracingQualitySwitchReplaceノードを使う必要があります。
(このノードはライトベイク時だけではなく通常のレイトレ描画にも影響しますのでご注意下さい。)
image.png
現時点では上記の状況に加え、CPULightmassで使用できていた一部のパラメーターがGPULightmassでは効かないなど、
CPULightmassとGPULightmassは全く同一の結果とはならない点を気をつける必要があるのですが、
(DiffuseBoostやUse Emissive for Static Lightingなどが挙動しません)
速度面や利便性という点でGPULightmassは非常に便利かと思いますので、
ケースバイケースで運用して頂けましたら幸いです。


それでは皆様楽しいLightmassライフを!

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?