NEUROMANTIC

自分でC/C++/UE4/Graphics/ゲームなどをやったことをメモするブログ

UE4のマテリアルのCustomノードでの拡張テクニック

forums.unrealengine.com

UE4でいろいろとマテリアルを触る時に、基本的に与えられたノードだけじゃ複雑なものがちゃんと書けないことがありました。という時に使ってこなすのがCustomというノードで、これは直接HLSLコードを書いてシェーダーを作成することが出来ます。

しかしCustomノード自体にもただ使うにはいくつかの限界があります。Functionが書けないとかですね。しかし上の記事ではCustomノードのHLSLをコードなどでいくつかのリミットを乗り越えることが出来たそうです。自分も勉強兼ねてメモしてみました。

1. Custom Functions

UE4で全域のマテリアルシェーダー関数を作成するには.usfファイルを弄って追加か削除することが出来る。しかしこうすると.usfが適用される全てのマテリアルアセットが再度コンパイル通さなければならない。

しかしHLSLコードでstructみたいな構造体を宣言、その中に関数を定義することで関数を使用してより構造化されたマテリアルが作れる。

struct Functions
{

  float3 OrangeBright(float3 c)
  {
      return c * float3(1, .7, 0);
  }

  float3 Out()
  {
    return OrangeBright(InColor);
  }

};

Functions f;
return f.Out();

上のコードではインプット引数としてInColorだけを入れればこれで終わる。こうして得られる長所は全域の.usfを弄らずすばやくマテリアルを仕上げることが出来るというところだ。

2. External Code and #include

#include "Your Path...\Test.hlsl"
return 0;
// enter spaces here and press enter to retrigger compilation

内部のエディタからコードを作成する必要なく、ただ外部からhlslファイルを#includeして作成する。ただし記事のコメントによると外部のhlslファイルは#pragma onceを付けないとならないらしい。

そしてコードのreturn 0;は意図的なもので、UE4の独特なシェーダーコンパイル環境で追加コードなし#includeをさせるために使われるものだそう。また最後の行で追加的なコードを書かないとしたらスペースを一個書かなければならないらしい。


No.3とNo.4はなんのことかわかりませんけどわかる次第に追記しますね。