The idea is simple but very useful : move all renderer code into plugin, and make it possible to register new renderer plugin in user project (like Unity SRP)
Benifit
1.modify render pipeline without compile and redistribute the engine.
2.redistribute rendering modification on github easily
3.be able to sell renderer plugin on marketplace, or plugin that depends on renderer modification (like Hair grooming plugin)
Pseudo code:
static FSceneRendererFactory* GFactory = nullptr;
// register custom renderer here
void RegisterRendererFactory(FSceneRendererFactory* SceneFactory) {GFactory = SceneFactory;}
FSceneRenderer* FSceneRenderer::CreateSceneRenderer(const FSceneViewFamily* InViewFamily, FHitProxyConsumer* HitProxyConsumer)
{
EShadingPath ShadingPath = InViewFamily->Scene->GetShadingPath();
FSceneRenderer* SceneRenderer = nullptr;
if (ShadingPath == EShadingPath:
eferred)
{
SceneRenderer = new FDeferredShadingSceneRenderer(InViewFamily, HitProxyConsumer);
}
else if(ShadingPath == EShadingPath::Mobile)
{
SceneRenderer = new FMobileSceneRenderer(InViewFamily, HitProxyConsumer);
}
else
{
// create custom renderer
SceneRenderer GFactory->Create(InViewFamily, HitProxyConsumer);
}
return SceneRenderer;
}
Benifit
1.modify render pipeline without compile and redistribute the engine.
2.redistribute rendering modification on github easily
3.be able to sell renderer plugin on marketplace, or plugin that depends on renderer modification (like Hair grooming plugin)
Pseudo code:
static FSceneRendererFactory* GFactory = nullptr;
// register custom renderer here
void RegisterRendererFactory(FSceneRendererFactory* SceneFactory) {GFactory = SceneFactory;}
FSceneRenderer* FSceneRenderer::CreateSceneRenderer(const FSceneViewFamily* InViewFamily, FHitProxyConsumer* HitProxyConsumer)
{
EShadingPath ShadingPath = InViewFamily->Scene->GetShadingPath();
FSceneRenderer* SceneRenderer = nullptr;
if (ShadingPath == EShadingPath:

{
SceneRenderer = new FDeferredShadingSceneRenderer(InViewFamily, HitProxyConsumer);
}
else if(ShadingPath == EShadingPath::Mobile)
{
SceneRenderer = new FMobileSceneRenderer(InViewFamily, HitProxyConsumer);
}
else
{
// create custom renderer
SceneRenderer GFactory->Create(InViewFamily, HitProxyConsumer);
}
return SceneRenderer;
}
Comment