こちらは「裏 Unreal Engine 4 (UE4) Advent Calendar 2016」18日目の記事です。
裏 Unreal Engine 4 (UE4) Advent Calendar 2016 - Qiita
今回はMaterialのCustomノードのお話です。
使用環境
・Unreal Engine4.13.2
目次
・参考文献
・Customノードとは
・別の方法でHLSLを書きたい
・参考文献
一昨年Advent Calenderのシモダさんのエンジン拡張の記事
UE4のShading Modelを拡張して独自のライティングや描画機能を追加する方法を公開するよ! - Qiita
昨年のAdvent CalenderのもんしょさんのCustomノードの記事
もんしょの巣穴blog [UE4] Customノード3分ハッキング
おかずさんのCustomノードの記事
UE4のCustomノード(カスタムHLSLシェーダ)を使ってみた - ぼっちプログラマのメモ
・Customノードとは
Customノードはノード内にHLSLを記述できる特殊なノードです。
公式ドキュメント
Unreal Engine | Custom 表現式
メリット
・ノードで書くと冗長な処理を楽に記述できる。
・マテリアルBPにはない、ローカル変数やループ処理が使える。
デメリット
・基本的には#includeが出来ない。
・ノードで作成したシェーダーよりも効率が悪い(詳しくは上記ドキュメント参照)
・コメントを書けない。(と思ったら書けるようになってました)
・別の方法でHLSLを書きたい
理由
・ノード内に書くのは書きにくい。IDEやテキストエディタで書きたい。
方法
①参考文献で紹介したもんしょさんのinclude方式
ただし
「ハック的な手法なのでいつ穴を塞がれるかわかりません」
とのことでしたので、別の方法で書いてみたいと思いました。
そこでシモダさんのEditor拡張の記事を眺めていてふと思いました。
②Engineに書いちゃおう
Engine/Shaders/Common.usfに直接書いてしまえばいいのではないか、と。
ということで実際に書いてみました。
今回書いたのはこちら
やり方簡単DitherTemporalAAとオパシティマスクの間にCustomノード挟んでfloat入力1つDitherInput等の名前にし#if SHADOW_DEPTH_SHADER
— シモダジュンヤ Jun Shimoda (@junyash) 2016年11月22日
return 1;#else
return DitherInput;#endif
と pic.twitter.com/g1eL2fVYZ1
で紹介されていた、Ditherのシャドウのちらつきを回避するコードです。
Engine/Shaders/Common.usf
float Dither(float DitherInput) { #if SHADOW_DEPTH_SHADER return 1; #else return DitherInput; #endif }
後はエンジンを起動後にCtrl + Shift + . でシェーダーをコンパイル
実際の呼び出し
Customノード内で関数呼び出しを行うだけ。
①
return Dither(ditherInput);
②
Dither(ditherInput);
returnがあってもなくても良いみたいです。
余談ですが、Ditherと半透明の比較。
手前が半透明で奥がDitherです。
ライティングが暗いので、分かりにくいのもありますがDitherは半透明の代替として十分なクオリティですね!
空とCubeの一部が真っ赤なのはさておき、半透明とDitherではシェーダーパフォーマンスが随分と違うのがお分かりかと思います。
以上です!