2020.7.3はじめにこんにちは。UnrealEngine5が気になるプログラマーの村田です。残念ながらUE5のお話ではなく、今回もUE4のお話になりますが、最後までご覧頂けると幸いです。タイトルの通り、マテリアルノードを作ってみたお話になります。UE4の標準でシェーダの組み込み関数に対応する各ノードが実装されておりますが、中にはノード化されていないものもあります。その中でも今回は「Smoothstep」関数のノードを作成してみました!Smoothstep関数についてはこちらをご覧ください。※使用したバージョンはUE4.25.0になります。※エディタの言語環境は日本語になります。実装まず、Smoothstepノード用のクラスを追加しましょう。UE4.25.0/Engine/Source/Runtime/Engine/Classes/Materials階層にMaterialExpressionSmoothstep.hファイルを追加し、クラスの定義を行います。Interface};実装はMaterialExpression.cppに記述します。指定しない場合は「その他」に追加される。↑で指定したカテゴリーを反映。END続いて上記コードの38行目のShaderコードに変換するためのSmoothstep関数を実装していきます。FMaterialCompilerクラスは抽象クラスで派生クラスに実装を任せています。FMaterialCompilerクラスには純粋仮想関数を追加しておきます。同ファイルにFMaterialCompilerを継承したFProxyMaterialCompilerが存在するので先程の関数をオーバーライドしておきます。今回はこのクラスは特に関係ないので中身は気にしなくてもOKです。Compiler;};続いてHLSLMaterialTranslator.hと.cppにもFMaterialCompilerを継承したFHLSLMaterialTranslatorクラスが存在するのでオーバライドしていきます。今回大事なのはこっちのクラスになります。(ヘッダーファイルの方は宣言だけなので割愛します。ENDコードの編集は次で最後です。実装が完了したので、実際に動作を確認してみます。値をグラフ化して確認してみましたが問題なさそうですね!念の為に変換されたShaderコードも確認してみます。Local6;ちゃんとSmoothstep関数が呼ばれてますね!最後にやってみると案外簡単にノードを追加できました。UE4はソースが公開されているので、こういう拡張がしやすくて助かりますね。今回紹介した方法の他にもCustomノードを使えば、ノード化されていない関数を呼び出すことが可能です。Customノードだと関数の呼び出しが増えるので、今回の手法より少しだけ負荷が高くなる気がします。(ちゃんと計測したわけではないです。)今回の内容が少しでも皆様の開発の参考になれば幸いです。株式会社ロジカルビートは一切の責任を負いません。understrap.com。