# InstancedStaticMeshComponentの描画負荷について

**URL:** <https://forums.unrealengine.com/t/instancedstaticmeshcomponent/431297>\
**Category:** Rendering\
**Tags:** unreal-engine, Rendering, instancing, UE4, question\
**Created:** [August 9, 2018, 3:05pm UTC](https://forums.unrealengine.com/t/instancedstaticmeshcomponent/431297 "2018-08-09T15:05:13Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Answers.Archive](https://d3kjluh73b9h9o.cloudfront.net/original/4X/2/8/5/28502927f1d97ba1051b3b47ccfe17233bf41ef0.png) [@Answers.Archive](https://forums.unrealengine.com/u/Answers.Archive)\
**Post date:** [August 9, 2018, 3:05pm UTC](https://forums.unrealengine.com/t/instancedstaticmeshcomponent/431297/1 "2018-08-09T15:05:13Z")

</div>

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

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)

```

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

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

---

<div class="post-metadata">

**Author:** ![Answers.Archive](https://d3kjluh73b9h9o.cloudfront.net/original/4X/2/8/5/28502927f1d97ba1051b3b47ccfe17233bf41ef0.png) [@Answers.Archive](https://forums.unrealengine.com/u/Answers.Archive)\
**Post date:** [August 9, 2018, 3:05pm UTC](https://forums.unrealengine.com/t/instancedstaticmeshcomponent/431297/2 "2018-08-09T15:05:16Z")

</div>

確認したところおっしゃる通りでした！何も設定していないマテリアルでも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

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