InstancedStaticMeshComponentの描画負荷について

お世話になっております。

InstancedStaticMeshComponent(Hierarchicalではない方)の描画負荷の検証を行っていますが、気になることがありましたので質問させてください。

普通のStaticMeshComponentではマテリアルにありますDitheredLODTransitionの設定が正しく反映されているのですが、InstancedStaticMeshComponentではマテリアルの設定に関わらず常にDitheredLODTransitionが有効になっているようです。

これはシェーダーのコンパイル時に、マテリアルの設定を見ていないために発生しているようでした。

// InstancedStaticMesh.h
struct FInstancedStaticMeshVertexFactory : public FLocalVertexFactory
{
	static void ModifyCompilationEnvironment(EShaderPlatform Platform, const FMaterial* Material, FShaderCompilerEnvironment& OutEnvironment)
	{
...
		OutEnvironment.SetDefine(TEXT("USE_INSTANCING"),TEXT("1"));
		OutEnvironment.SetDefine(TEXT("USE_DITHERED_LOD_TRANSITION_FOR_INSTANCED"), ALLOW_DITHERED_LOD_FOR_INSTANCED_STATIC_MESHES);
...
	}
};

// LocalVertexFactory.ush, MaterialTemplate.ush
#if USE_INSTANCING
...
	#define USE_DITHERED_LOD_TRANSITION USE_DITHERED_LOD_TRANSITION_FOR_INSTANCED
#else
...
#endif

LocalVertexFactory.ush, MaterialTemplate.ush を以下のように変更してみたところ、マテリアルの設定でDitheredLODTransitionを切り替えられるようになったのを確認しました。

- #define USE_DITHERED_LOD_TRANSITION USE_DITHERED_LOD_TRANSITION_FOR_INSTANCED
+ #ifndef USE_DITHERED_LOD_TRANSITION_FROM_MATERIAL
+ 	#error "USE_DITHERED_LOD_TRANSITION_FROM_MATERIAL should have been defined"
+ #endif
+ #define USE_DITHERED_LOD_TRANSITION (USE_DITHERED_LOD_TRANSITION_FROM_MATERIAL && USE_DITHERED_LOD_TRANSITION_FOR_INSTANCED)

この変更が正しいものかどうか、確認していただくことは出来ますでしょうか?

よろしくお願い致します。

確認したところおっしゃる通りでした!何も設定していないマテリアルでもInstanced用ではClip命令が使われておりました。(本来は下のコードの一番したのClipLODTransitionの中身が空になるのが適切かと思います。)

void ClipLODTransition(float2 SvPosition, float DitherFactor)
{
	if (abs(DitherFactor) > .001)
	{
		float RandCos = cos(dot(floor(SvPosition.xy), float2(347.83451793,3343.28371963)));
		float RandomVal = frac(RandCos * 1000.0);
		float  RetVal = (DitherFactor < 0.0) ?
			(DitherFactor + 1.0 > RandomVal) :
			(DitherFactor < RandomVal);
		clip(RetVal - .001);
	}
}

void ClipLODTransition(FMaterialPixelParameters Parameters, float DitherFactor)
{
	ClipLODTransition(Parameters.SvPosition.xy, DitherFactor);
}

void ClipLODTransition(FMaterialPixelParameters Parameters)
{
	ClipLODTransition(Parameters, Parameters.PerInstanceParams.w);
}

修正方法も問題ないと思います。正式に修正されるようにチケットを登録いたしましたので、本件解決されるまで今しばらくお待ち下さい。

UE-61947 - Instanced Staticmesh Components always turn on USE_DITHERED_LOD_TRANSITION

この度は御指摘ありがとうございました!