メッシュペイントあれこれ

たまにお世話になるわりに解説は行ってなかったな、と思ったのでメッシュペイントの話。

メッシュペイントとは、UE4上でメッシュに対して色を塗り、その色を利用してあれやこれややる機能です。

色をそのまま使うことはほとんどなく、主に複数のマテリアルパラメータ(ベースカラーやメタリックなど)のブレンドウェイトとして利用します。

ドキュメントに詳しく書いてありますので、参考にしてみてください。

メッシュペイントのユーザーガイド

https://docs.unrealengine.com/latest/JPN/Engine/UI/LevelEditor/Modes/MeshPaintMode/VertexColor/index.html

このガイドでは頂点ペイントについて書かれていますので、簡単に頂点ペイントについて書いてみます。

頂点ペイントはその名の通り、頂点にペイントする機能です。

ペイントしたカラーやアルファ値は頂点カラーとして利用できますので、マテリアルノードの [Vertex Color] を使って参照することが出来るようになります。

今回はわかりやすくするため、簡単なマテリアルで動作を確認してみましょう。

ue325.jpg

頂点カラーのRを利用して2つのテクスチャをブレンドしているだけです。

このマテリアルを貼り付けたメッシュを2つ、レベルに配置してみましょう。

ue326.jpg

見ての通り、どちらも草テクスチャが前面に出てきています。

頂点カラーはデフォルトではすべて1.0の白が入っているためです。

では頂点ペイントを行いましょう。

ペイントを行いたいメッシュを選択し、モードから [ペイント] を選択すると、モードタブが以下のようになります。

ue327.jpg

おすすめの編集方法としては、一旦頂点カラーを黒に塗りつぶします。

この手のペイントを処理する場合、ベースとなるマテリアルの上に何か別のマテリアルが存在する(岩の上の苔、一部が錆びた鉄など)として処理する場合が多く、その場合、白い部分が上に乗っているマテリアルと認識することが多くなるのではないかと思います。

今回のサンプルでも石のマテリアルの上に草を乗せる、という形で対応したいので、最初は石のマテリアルが見えていてほしいでしょう。

もちろん、マテリアル作成時に黒が草、白が石としてもいいのですが、なんとなく感覚的に違う印象がありますので、ベースを黒とします。

方法は簡単で、[塗り色] を黒に設定し、塗りつぶしボタンを押すだけです。

ue328.jpg

石のテクスチャだけが見える状態になったのでここからペイント開始です。

塗り色を白、チャンネルをレッドのみチェックにして3Dペイントツールのように塗り塗りしていきます。

ue329.jpg

塗り範囲の円内に頂点が入ると、その頂点の現在のカラーが表示されるのでわかりやすいです。

ここまででわかるかと思いますが、同じメッシュであっても頂点ペイントで生成される頂点カラーは別のものとして扱われます。

左のペイントしたメッシュと右のペイントされていないメッシュでは表現が別になっているのがわかるでしょう。

レベル内に配置されたメッシュは、ペイントされると元メッシュの頂点カラーとは別の頂点カラーが割り当てられるわけです。

この頂点カラーをすべてのメッシュに適用したい場合、塗りつぶしボタンの右のボタンを押すとすべてのメッシュに適用されます。

ue330.jpg

ただし、これは正確にはすべてのメッシュに適用するのではなく、元のメッシュを変更します。

元のメッシュが変更されているので、この後に配置された同一メッシュも同じように変更してしまっています。

レベル内のすべてのメッシュに適用、ではない点に注意してください。

というわけで頂点ペイントの話でしたが、続きからでテクスチャペイントの使い方を見て行きましょう。

頂点ペイントは大変便利な機能ではあるのですが、頂点数が少ないメッシュでは意図通りのペイントが出来ないことのほうが多いでしょう。

現在の据え置きゲーム機、およびPCであればメッシュの頂点数は十分にあるはずなので、ほとんどの場合で頂点ペイントで処理を完結できます。

しかし、例えばUE4でメッシュを作成した場合などでは十分な頂点数を確保できていなかったりすることもあります。

そのような場合の緊急措置、というわけではないのでしょうけど、どうしても頂点ペイントでは思った映像が作れない場合のためにテクスチャペイントの機能も用意されています。

ここからはこのテクスチャペイントの使い方を紹介します。ドキュメントが見つからなかったので手探りではありますが…

テクスチャペイントを行うには、ペイントモードで [テクスチャ] を選択します。

ue331.jpg

ペイントの仕方そのものは頂点ペイントと変わりませんが、どのテクスチャにペイントを行うかを指定しなければなりません。

ペイント可能なテクスチャは選択中のメッシュに登録されているマテリアルが使用しているテクスチャのみです。

どのテクスチャが利用されているかどうかをエンジンが調べて、ドロップダウンリストに表示してくれます。

ue332.jpg

まずペイントしたいテクスチャをどう用意するかですが、一番簡単なのは必要な解像度の真っ黒な画像をインポートすることです。

これならWindows付属のペイントツールでも用意できるので、作成してインポートしておきましょう。

次にこのテクスチャを利用してマテリアルを作成します。

マテリアルは先の頂点ペイントと同様の処理を行いますが、ブレンドウェイトとしてインポートしたペイント対象テクスチャのRを利用する部分が違います。

また、ペイント対象テクスチャをテクスチャ2Dパラメータとして設定することです。

パラメータ名はなんでもいいのですが、なぜこのようにするかはあとで説明します。

もう1つ、テクスチャをサンプリングする際のUV値を1番にしておくことです。0番と違い、1番は通常ユニークなUV値が設定されているからです。

ue333.jpg

さて、ペイントです。

ペイントする際にはペイントするテクスチャ、およびUV値を指定してペイントする必要があります。

 

ue334.jpg 

当然ですが、ペイントされたテクスチャはそれに合わせて変化します。

テクスチャが変化することによっていくつかの影響が出てくることになります。

まず1つ目として、ペイントされたテクスチャはリニアカラーで保存されます。

インポートしたテクスチャはほとんどがsRGB設定のはずですが、ペイントが行われるとリニアになってしまいます。

ペイント対象テクスチャをインポートした際には予めsRGB設定にしないようにするとよいのですが、sRGBでペイントしてしまうとテクスチャサンプルでエラーが発生するようになります。

テクスチャサンプルノードはテクスチャのピクセルに対してどのような処理を行って正常な値を取得するか計算する機能が備わっており、リニアカラーとsRGBカラーではその処理が異なります。

そのため、編集前はsRGBだったテクスチャが編集後にリニアカラーになるとマテリアルがエラーとなりますので注意してください。

特にペイント対象ではなかったテクスチャを誤ってペイントしてしまった場合に問題が発生するでしょう。

もう1つは頂点ペイントと違って自動的にペイント対象テクスチャが作成されないという点です。

そのため、テクスチャをペイントすると同一マテリアルや、別のマテリアルでも同じようにペイント対象テクスチャを参照しているマテリアルにも影響を与えてしまいます。

ue335.jpg 

この問題に対応するため、テクスチャペイントツールには対象テクスチャを複製する事ができます。

ue336.jpg 

この複製ボタンを押すと複製テクスチャの保存場所、名前を指定するフォームが表示されるので、適当な場所と名前で保存します。

しかもテクスチャの複製だけでなく、マテリアルもインスタンスを作成しメッシュに登録します。

この時、対象テクスチャが元マテリアル内でパラメータ化されていると、自動的にそのパラメータにコピーしたテクスチャを割り当ててくれます。

先ほどペイント対象テクスチャをパラメータにしておけ、と言った理由はこれです。

テクスチャペイントの注意点としては、サンプリングするテクスチャが増える関係でGPUの処理が重くなる可能性が高い点です。

頂点数が多めだったとしてもテクスチャサンプリングの方が重いことが多いかと思います。

リソースが増えてしまうのも問題でしょう。

UVチャンネルにライトマップを利用すれば複製の必要がないのでは?と思う方もおられるかもしれませんが、テクスチャペイントの [UVチャンネル] はメッシュに登録されているUVチャンネルのみ選択可能なようです。

また、これは私個人の環境の問題かもしれませんが、テクスチャペイントを実行するとエディタが大変重くなる現象がありました。

その上GPUがクラッシュしたのか、画面がブラックアウトしたことが何回かありました。

テクスチャペイントが原因なのか、PCの問題なのかは判断できませんが、使用する際には気をつけてください。