【UE4】マテリアルエディタのプレビュー表示の赤グラデーションを従来のモノクロにしたい
Unreal Engineの4.23か4.24くらいから、突如マテリアルエディタの演算結果のプレビュー表現が赤一色になった。従来は白黒で、画面は小さくてもかなりありがたい表示だったのでかなり困った。あと単純にマテリアルをゴニョゴニョと試行錯誤するのが好きなので、この仕様変更はかなりきつかった。
でももう我慢できずに自力で直すことにしました。
欧米人だとこの表現が好まれるのかも、日本人の中でも私だけなのかよくわからないのですが、とにかく赤のグラデーションって識別しにくい。微妙な濃淡が殆どわからないんです。
私だけなのかと思ったら結構グチってる人はいるみたいです。
- Why single channel data preview is now red? – UE4 Answer Hub
- Material node preview. – UE4 Answer Hub
- My nodes are red in preview instead of white. How to fix it? – reddit
やりかた
エンジンソースをいじります。バージョンは4.26.1。
場所は Engine\Source\Editor\MaterialEditor\Private\MaterialEditor.cpp の241行目。
ずらずら書いていますが、最後のCompiler->ForceCastの第3引数だけ差し替えます。
ちなみに私が確認したところ少なくとも4.24以降はソースコードに変化はありませんでした。
int32 FMatExpressionPreview::CompilePropertyAndSetMaterialProperty(EMaterialProperty Property, FMaterialCompiler* Compiler, EShaderFrequency OverrideShaderFrequency, bool bUsePreviousFrameTime) const { // needs to be called in this function!! Compiler->SetMaterialProperty(Property, OverrideShaderFrequency, bUsePreviousFrameTime); ・・・略・・・ // output should always be the right type for this property return Compiler->ForceCast(Ret, FMaterialAttributeDefinitionMap::GetValueType(Property), //MFCF_ExactMatch); // これだとfloat->vector3のup-castを拒否される ⇒ MaterialFloat3(1,0,0) MFCF_ReplicateValue); // これだとup-cast強制執行する ⇒ MaterialFloat3(1,1,1) // yanai プレビューを赤じゃなくて白黒にしたい }
結果
調査記録
とりあえず怪しそうな箇所にブレークポイント置きまくって、ソースコードを調査して30分…それらしい箇所がありました。FMatExpressionPreview::CompilePropertyAndSetMaterialProperty()です、ここでシェーダーコンパイルしています。
FHLSLMaterialTranslator::ForceCast()関数でHLSLに渡すための文字列を生成しているのですが、float型をfloat3型にキャストすることは原則認めないルールになっていて、float1型をfloat3型にキャストは可能、というソースになっています。まあこれ自体は仕様なのでしょう。
しかしマテリアルプレビューからシェーダーコンパイルを実行する際にMFCF_ExactMatchを渡すことが意図しているのかは分かりませんでした。
一方で、bReplicateValue=trueのときは強制的にキャストを許可するようになっていますので、trueになってくれるための条件、つまり今回の修正内容である第3引数をMFCF_ReplicateValueに置換しました。
根本原因と最適な修正手段を考察しています。私はシェーダーってGLSLしか書いたことがないのでHLSLのことは疎いのですが、これってもしかしてfloat(1,1,1)でシェーダーコンパイルしようとしていることが誤りだったりしますか? 正解はfloat1(1,1,1)って書くのかな? 調べるとHLSLっにはfloat型って無くて、float1型で書くらしいのですが。(詳しい方いましたら、私の勉強のためにお教えいただきたいです。)
OpenCL の vector 型 – ホイール欲しい ハンドル欲しい
ちなみにこれらのソースはHLSLMaterialTranslator classってのが担っていますが、わりかし最近できた新しいクラスです。
新規開発「float->float3のcastはやらせねールールだから。そっちで引数変えるとか対応してよ。」
既存開発「赤グラデーションでも別にわからんわけでもないし放置放置。」
みたいな感じなんでしょうか。