Unreal Engine的自定义扩展思路
UE是基于C++的开源引擎,Epic官方积极进行着各种升级迭代,同时多数要求较高的项目也会有自己的深度定制。基础的直接基于UE源码进行注释和修改的方式会造成后期同官方升级代码之间大量的合并问题,并且也容易出现大量引擎的重编。为了更好的解决各种引擎定制而出现的问题,下面提出一些思路进行探索。
定制需求
官方扩展机制
最终方案
自定义渲染管线
继承官方(或者可以完全自写)FSceneRenderer的子类,根据需要重写需要定制的函数接口。
定义一个Console命令,动态切换默认管线和自定义管线
static TAutoConsoleVariable<int32> CVarDynamicSceneRenderer(
TEXT("r.DynamicSceneRenderer"),
0,
TEXT("Dynamic switch different scene renderer. 0: Default UE official scene renderer; 1: Custom scene renderer."),
ECVF_RenderThreadSafe);
使用此状态命令来使用不同的SceneRender。
另外,由于UE对于静态模型渲染存在Cache机制,切换渲染过程需要刷新下:
#if !UE_BUILD_SHIPPING
// when swith scene renderer dynamically, we also need update static mesh caches.
static bool bPreviousUsedDynamicSceneRendererValid = false;
static bool bPreviousUsedDynamicSceneRenderer = false;
if (bPreviousUsedDynamicSceneRendererValid)
{
if (bPreviousUsedDynamicSceneRenderer != bUseDynamicSceneRenderer)
{
FScene* const Scene = InViewFamily->Scene->GetRenderScene();
Scene->bScenesPrimitivesNeedStaticMeshElementUpdate = true;
}
}
else
{
bPreviousUsedDynamicSceneRendererValid = true;
}
bPreviousUsedDynamicSceneRenderer = bUseDynamicSceneRenderer;
#endif