[UE5.7][C++]遂に完成したC++プラグインUE用HLSL.EditorのMaterial作成機能

もうこれでノードスパゲッティから解放される

導入方法

0,以下のリンクをダウンロード
furcraeaHLSLEditor_UE5.7.3V3.zip
https://drive.google.com/file/d/1Qmz5Y_uT0VGKkrk1wskvw2DRbnND6or4/view?usp=drive_link
furcraeaHLSLEditor_UE5.7.3V2.zip
https://drive.google.com/file/d/1CSXmSebk7hLM02qM5jKDv2ndNJ4jhUi7/view?usp=sharing

1,Pluginsフォルダにzipを解凍して入れてください。

  パスの例:UEプロジェクトフォルダ\Plugins\furcraeaHLSLEditor\Shaders

2,プラグインで「furcraeaHLSLEditor」を有効化

使用方法

コンテンツブラウザで右クリック>Miscellaneous>Code Material Assetを作成

できた New Code Material AssetをダブルクリックでHLSL編集画面が開く

Saveをクリックすると。。。GeneratedフォルダーにM_NewCodeMaterialAssetが作成されます。


まだまだ、1つしかCodeMatUser.ushがないので一つしかマテリアルが成立しないなどの不備があるので更新していく予定です。<-以下の画像のように修正済みです。

furcraeaHLSLEditorをGitHub で公開しました。
https://github.com/nobolu-ootsuka-unrealengine/furcraeaHLSLEditor/commits?author=nobolu-ootsuka-unrealengine

修正履歴



1つしかCodeMatUser.ushがないので一つしかマテリアルが成立しないなどの不備を修正

furcraeaHLSLEditor_UE5.7.3V2

Projects と RenderCore を bBuildEditorをガード外に移動(ランタイムでも必要なモジュールのため)

furcraeaHLSLEditor_UE5.7.3V3

CodeMaterialAsset が吐くMaterialのフォルダを (固定)Generated から (ユーザーが作った)CodeMaterialAssetと同じフォルダに変更した

CodeMaterialCompiler.cpp に2箇所変更しました。

① MakeMaterialPackagePath 関数(生成先パスを決定)

  • 変更前:/Game/Generated/M_xxx 固定
  • 変更後:Asset->GetOutermost()->GetName() でアセット自身のパッケージパスを取得し、FPackageName::GetLongPackagePath()
    でフォルダ部分を抜き出して {同じフォルダ}/M_xxx を返す ② CreateOrLoadMaterial の MakeDirectory 呼び出し
  • 変更前:MakeDirectory(“/Game/Generated”) 固定
  • 変更後:MakeDirectory(FPackageName::GetLongPackagePath(MakeMaterialPackagePath(Asset))) —
    生成先パスからフォルダを算出して作成 これにより、例えば Content/0_furcraeaTokyo/CodeMaterialAsset/NewCodeMaterialAsset に保存された CodeMaterialAsset
    に対しては、生成マテリアルも同じ Content/0_furcraeaTokyo/CodeMaterialAsset/M_NewCodeMaterialAsset に出力されます。

以下は未公開の機能

アウトラインシェーダーのサンプルを追加


新しい CodeMaterialAsset
を作成してこのコードを貼ってください:

// @param float OutlineWidth = 2.0
// @param float3 OutlineColor = 0.0,0.0,0.0

// World Position Offset: 頂点を法線方向に膨らませる(アウトラインシェル)
float3 MainWPO(float3 VertexNormal, float OutlineWidth)
{
return VertexNormal * OutlineWidth;
}

// ピクセル出力: 単色アウトライン色
float3 MainHLSL(float2 uv, float3 OutlineColor)
{
return OutlineColor;
}

Save を押すと:

ノード接続
ScalarParameter “OutlineWidth”(デフォルト 2.0)MainWPO の OutlineWidth 入力
VectorParameter “OutlineColor”(デフォルト 黒)MainHLSL の OutlineColor 入力(.rgb マスク)
VertexNormalWSMainWPO の VertexNormal 入力
WPO Custom ノードWorldPositionOffset ピン
PS Custom ノードEmissiveColor ピン

使い方: このマテリアルをキャラクターメッシュの 2番目のマテリアルスロット
に設定し、そのスロットのメッシュの法線を外向き(Front Face
Culling)にするか、同じメッシュを少し大きくしてアウトライン専用スロットとして使います。OutlineWidth と OutlineColor
はマテリアルインスタンスから調整できます。

今の変更でクラッシュするので変更

● 次に VertexNormalWS を WPO がある場合だけ生成するよう修正します。

原因と修正の説明:

FlushShaderFileCache() をゲームスレッドから呼ぶと、バックグラウンドのシェーダーコンパイルスレッドが処理中のジョブのデ
ータを無効化してしまい、OptionalDataSize == -1 アサートでクラッシュしていました。

修正内容:

  • FlushShaderFileCache() を削除
  • VertexNormalWS ノードの生成を MainWPO がある場合のみに限定 注意点: .ush の内容を編集して Save
    を押しても、キャッシュにヒットすると古いシェーダーで動く場合があります(次回エディター起動 or マテリアルの Recompile
    で反映されます)。初回作成は必ず正しく動きます。

キャラクターはマテリアルスロットを11個持っていてそれぞれ頭、髪、服、足などになってる
だから、BP_CombatCharacterの中にMeshの下にskeltalMeshを作ってそこにマテリアル11個全部アウトラインにしたメッシュを設定した。

キャラクターはマテリアルスロットを11個持っていてそれぞれ頭、髪、服、足などになってる
だから、BP_CombatCharacterの中にMeshの下にskeltalMeshを作ってそこにマテリアル11個全部アウトラインにしたメッシュを
設定した。

● なるほど、正しい構成です。ただ今のマテリアルは両面描画(フロント面もバック面も黒く塗りつぶす)になっているため、ア
ウトラインメッシュが正面からキャラクターを隠してしまっています。

アウトラインのシェル法では バック面だけ を描画する必要があります。コンパイラ側で MainWPO
があるとき自動的にそうなるよう修正します。

● Read 1 file (ctrl+o to expand)

● Update(D:\Sandbox\UE573petit25Cl\UE573petit25Cl\Plugins\furcraeaHLSLEditor\Source\furcraeaHLSLEditor\Private\CodeMater
ialCompiler.cpp)

───────────────────────────────────────────────────────────

● bIsTwoSided ではなく bTwoSided が正しいプロパティ名です。(UE5.7 のヘッダを確認)


╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

MainWPO があるマテリアルは自動的に次の設定になります:

  • TwoSided = true — 両面描画を有効にしてフロント面とバック面の両方を処理対象に
  • BLEND_Masked — OpacityMask に繋いだ値で面を破棄可能にする
  • TwoSidedSign * -1 → OpacityMask — フロント面(1)→-1(破棄)、バック面(-1)→1(描画) に変換

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です