🎃

【UE5】エミッシブによるライトの色・強さを柔軟に調整したい

2022/09/07に公開

UE5の新機能Lumenでは、マテリアルのエミッシブ値で周囲を照らすことができます。
これはライトの代替として使え、実際のライトアクターを使ったライティングより圧倒的に低コストなので、
フレームレートを稼ぎながらリッチなライティングらしき画面を得ることができます。

https://youtu.be/lQXwvfqm1S8

Epicが公開しているUE5の技術デモ 「The Matrix Awakens」 とそのサンプルプロジェクトである 「City サンプル」 では夜に切り替えての散策が行えますが、

https://www.unrealengine.com/marketplace/ja/product/city-sample

https://docs.unrealengine.com/5.0/ja/city-sample-project-unreal-engine-demonstration/

その夜でみられる照明も、ライトアクターではなくエミッシブがほとんどとのこと。


ライトアクターであれば、ライトごとに細かく値を調整してライティング作業を進められますが、
エミッシブ値を光らせている場合、マテリアルであるため個々の細かい調整はできず、
必要ならばそれだけ分のマテリアルを用意することになります。

それだと多分収集がつかないので、
レベルに置いたアクターごとにエミッシブ値を変えられる方法を考えてみました。

結果

後方のRGB各色の発光物はEmissiveによるもので、色はレベルにおいてから変えています。
ライトよりは低精度ですが低コスト、ぱっと見それらしく光っている感じになってます。

頂点カラーで光るマテリアル + ジオメトリスクリプトで頂点カラーを改変

やっているのは↑こういうようなことです。

マテリアルの準備

マテリアルを作成してUnlitにしてエミッシブカラーにVertex Colorを挿します。
これで、頂点カラーの値次第でエミッシブ発光するようになります。

BPの準備

Geometry Script を使います。
プラグインが有効になっていない場合は有効にしてプロジェクトを再起動しておいてください。

BP作成>Generated Dynamic Mesh Actorクラスを指定し、↑このように組みます。
「Append 〇〇」 でライトの形状をビルドさせます。
「Append Cube」「Append Disc」などがあるので好みの形状にします。
ほかに、試していませんが「Copy Mesh from Static Mesh」などを使えば
任意の形状をあとで受け取れるのではないかと思います。

Color型の変数を用意しておいて、「Set Mesh Constant Vertex Color」の「Color」インプットに挿しておきます。
これでレベル上で「Color」パラメータを編集すれば、それが頂点カラーにセットされます。
Color変数のデフォ値は RGBA = 1,1,1,1 にしておくといいかと思います。

コンポーネントリストの「Dynamic Mesh Component」を選択して、マテリアルに先ほど作った頂点カラーエミッシブマテリアルをアサイン。
影は落ちなくていいと思うので、Cast ShadowをOFFにしておきます。

レベルに置いて調整

作ったBPをレベルに配置し、それぞれにColorを変更します。
するとこのように、ライトアクターのLight Colorと同じような使い勝手で
照明光を変更できるようになりました。
(「Color」パラメータの上に「Intensity」というのも作っていますが、使っていません。)

注意点として、
この手法で作られるのはダイナミックメッシュです。
作られたメッシュはレベルに格納されるそうで、この手法のライトを置きまくるとなにか良くないことが起きるかもしれません(未確認)。
なお、 One File Per Actor を使っている場合は個別に保存されレベルに込み込みになることはないようです。ジオメトリスクリプトを使う場合はOFPA使用はセットな気がします。

https://docs.unrealengine.com/5.0/ja/geometry-script-users-guide/#ustaticmeshとudynamicmeshの主な相違点

また、とりあえず光ることは確認しましたが、「ライトを使うよりは低コスト」という点は多分変わらないはずですが詳細な負荷やLumen反射などでの振る舞いは確認していません。

初めてジオメトリスクリプトを触ってみましたが、いろいろできそうですね。

Discussion