Hello,
To reduce draw calls in my level, I wrote some code that replaces all recurring AStaticMeshActor
s with instances of a “parent” actor on Begin Play. However, this only works if the material used has “Used with Instanced Static Meshes” ticked. I tried to iterate through every material and set the parameter to true, but it crashes :
if (Material)
{
Material->bUsedWithInstancedStaticMeshes = true;
}
with the error :
=============================================================================
Unknown exception - code 00000001 (first/second chance not available)
"Fatal error: [File:D:\BuildFarm\buildmachine_++depot+UE4-Releases+4.10\Engine\Source\Run
UE4Editor_Core!FDebug::AssertFailed() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\core\private\misc\outputdevice.cpp:374]
UE4Editor_Engine!FMaterial::GetShader() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\engine\private\materials\materialshared.cpp:1525]
UE4Editor_Renderer!TBasePassDrawingPolicy::TBasePassDrawingPolicy() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\basepassrendering.h:547]
UE4Editor_Renderer!FDrawBasePassStaticMeshAction::Process() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\basepassrendering.cpp:257]
UE4Editor_Renderer!ProcessBasePassMesh() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\basepassrendering.h:973]
UE4Editor_Renderer!FBasePassOpaqueDrawingPolicyFactory::AddStaticMesh() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\basepassrendering.cpp:302]
UE4Editor_Renderer!FStaticMesh::AddToDrawLists() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\scenecore.cpp:331]
UE4Editor_Renderer!FPrimitiveSceneInfo::AddStaticMeshes() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\primitivesceneinfo.cpp:148]
UE4Editor_Renderer!FPrimitiveSceneInfo::AddToScene() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\primitivesceneinfo.cpp:190]
UE4Editor_Renderer!FScene::AddPrimitiveSceneInfo_RenderThread() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\rendererscene.cpp:352]
UE4Editor_Renderer!FScene::AddPrimitive'::
2’::EURCMacro_FAddPrimitiveCommand::DoTask() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\renderer\private\rendererscene.cpp:551]
UE4Editor_Renderer!TGraphTask<FScene::AddPrimitive'::
2’::EURCMacro_FAddPrimitiveCommand>::ExecuteTask() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\core\public\async\taskgraphinterfaces.h:779]
UE4Editor_Core!FTaskThread::ProcessTasks() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\core\private\async\taskgraph.cpp:539]
UE4Editor_Core!FTaskThread::ProcessTasksUntilQuit() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\core\private\async\taskgraph.cpp:340]
UE4Editor_RenderCore!RenderingThreadMain() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\rendercore\private\renderingthread.cpp:310]
UE4Editor_RenderCore!FRenderingThread::Run() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\rendercore\private\renderingthread.cpp:411]
UE4Editor_Core!FRunnableThreadWin::Run() [d:\buildfarm\buildmachine_++depot+ue4-releases+4.10\engine\source\runtime\core\private\windows\windowsrunnablethread.cpp:74]
I believe this is intended, and that you’re not supposed to change material parameters at runtime. However, It would really be a pain to go through all my materials and flag all the necessary ones for instancing. Would replacing all my materials with material instances bring a big loss of performance? Or do I really need to do this manually?
Any input would be greatly appreciated,
Arnaud