PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 Materialの小話01

こちらは「裏 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に直接書いてしまえばいいのではないか、と。
ということで実際に書いてみました。
今回書いたのはこちら


で紹介されていた、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);

f:id:PaperSloth:20161214223014p:plain


Dither(ditherInput);

f:id:PaperSloth:20161214223211p:plain

returnがあってもなくても良いみたいです。



余談ですが、Ditherと半透明の比較。
手前が半透明で奥がDitherです。
f:id:PaperSloth:20161214223813p:plain
ライティングが暗いので、分かりにくいのもありますがDitherは半透明の代替として十分なクオリティですね!

f:id:PaperSloth:20161214223913p:plain
空とCubeの一部が真っ赤なのはさておき、半透明とDitherではシェーダーパフォーマンスが随分と違うのがお分かりかと思います。


以上です!


明日のAdvent Calendar

明日(19日目)は どんぶつさん(@donbutsu17) による
UE4のロード周りの設定と検証 - Qiita」です。



ではまた!