この質問は、以下のスレッドに関連して作成されました: [Content removed]
お世話になっております。
上記質問でマテリアルの統計情報の取得について教えていただいたのですが、
マテリアルエディタ上で該当マテリアルを開かないと情報が取得できませんでした。
こちらマテリアルエディタで開いていないマテリアルのアセットの情報(統計情報)の取得する手段を教えていただきたいです。
よろしくお願いします。
この質問は、以下のスレッドに関連して作成されました: [Content removed]
お世話になっております。
上記質問でマテリアルの統計情報の取得について教えていただいたのですが、
マテリアルエディタ上で該当マテリアルを開かないと情報が取得できませんでした。
こちらマテリアルエディタで開いていないマテリアルのアセットの情報(統計情報)の取得する手段を教えていただきたいです。
よろしくお願いします。
お世話になっております。
具体的にどのような処理をされているのか不明ですので明確な答えを出しかねます点についてご了承下さい。
手元にて FMaterialStatsUtils::GetRepresentativeInstructionCounts 関数を公開(エンジン改変)して試した限りでは以下のような状況でした。
マテリアルエディタで開かずとも情報は出力できるようでした。
ご質問に書かれた症状と異なりますが、処理内容次第では実際にはこちらの条件(マテリアルエディタで開いていない)ではなく次の条件(マテリアルを参照した直後である)によって失敗している可能性があります。
マテリアルを選択(下記 EditorUtilityWidget にて)した直後は出力に失敗する場合がありました。
シェーダーの準備が間に合っていない場合にこうなっているようです。
手元でのテストでは後述する関数の冒頭において
GShaderCompilingManager->FinishAllCompilation();
とすることで回避できました。
こちらを参考に解決しない場合、お手数ですが状況を再現できる最小限のプロジェクトあるいはプレーンなプロジェクトからの手順をご共有いただけますでしょうか。
テストの内容について:
テストに使用したコード
`void UMyBlueprintFunctionLibrary::CheckMaterial2(UMaterial* Material)
{
#if WITH_EDITOR
TArrayFMaterialStatsUtils::FShaderInstructionsInfo Results;
static ERHIFeatureLevel::Type FeatureLevel = ERHIFeatureLevel::SM6;
FMaterialResource* MR = Material->GetMaterialResource(FeatureLevel);
FMaterialStatsUtils::GetRepresentativeInstructionCounts(Results, MR);
for (const auto& Result : Results)
{
UE_LOG(LogTemp, Log, TEXT(“%s, %s, %d”), *Result.ShaderDescription, *Result.ShaderStatisticsString, Result.InstructionCount);
}
#endif
}`
EditorUtilityWidget
[Image Removed]ボタン押下時にセットしたマテリアルをパラメータとして上記関数を呼び出します。
以上、よろしくお願いいたします。
ご回答ありがとうございます。
>手元でのテストでは後述する関数の冒頭において
>とすることで回避できました。
こちらは試したのですが、取得に失敗しました。
使い方としては以下のような形でコマンドラインからその関数を実行するようにしています。
「Engine\Binaries\Win64\unrealEditor-Cmd.exe プロジェクト.uproject -run=pythonscript -script=“該当関数を実行するpythonコード.py 引数”」
UnrealEditor起動してでのpython欄で実行する際は「該当関数を実行するpythonコード.py 引数」で実行しており、1回目は取得に失敗するのですが二回目は成功していました。
後だしですみませんが、コマンドライン経由で実行する際のマテリアル統計情報の取得方法が知りたいです。
コマンドレットでは基本的にレンダリング機能が無効になっており、シェーダー情報にもアクセスができません。
コマンドラインに以下のオプションを追加してお試し下さい。
-AllowCommandletRendering
よろしくお願いいたします。