UE4 前向渲染和延迟渲染
UE4 默认为 延迟渲染。延迟渲染 在渲染 大量 光照下效率要高于 前向渲染,但是需要 较高的内存 。
UE4 设置渲染
UE4.26
UE4.26 有 单独 的设置前向渲染的选项。FDeferredShadingSceneRenderer 用于其它非移动平台。它内部的实现是同时集成了 延迟渲染 和 Forward+ (升级版的前向渲染)。用于移动端的渲染器叫 FMobileSceneRenderer,它实现了一个传统的 Forward Renderer。
SceneRendering.cpp
FSceneRenderer* FSceneRenderer::CreateSceneRenderer(const FSceneViewFamily* InViewFamily, FHitProxyConsumer* HitProxyConsumer)
{
EShadingPath ShadingPath = InViewFamily->Scene->GetShadingPath();
FSceneRenderer* SceneRenderer = nullptr;
if (ShadingPath == EShadingPath::Deferred)
{
// 延迟渲染
SceneRenderer = new FDeferredShadingSceneRenderer(InViewFamily, HitProxyConsumer);
}
else
{
// 移动渲染
check(ShadingPath == EShadingPath::Mobile);
SceneRenderer = new FMobileSceneRenderer(InViewFamily, HitProxyConsumer);
}
return SceneRenderer;
}
UE4.9
UE4.9 在 SM4 以下使用前向渲染。
FSceneRenderer* FSceneRenderer::CreateSceneRenderer(const FSceneViewFamily* InViewFamily, FHitProxyConsumer* HitProxyConsumer)
{
bool bUseDeferred = InViewFamily->Scene->ShouldUseDeferredRenderer();
if (bUseDeferred)
{
// 延迟渲染
return new FDeferredShadingSceneRenderer(InViewFamily, HitProxyConsumer);
}
else
{
// 前向渲染
return new FForwardShadingSceneRenderer(InViewFamily, HitProxyConsumer);
}
}
bool ShouldUseDeferredRenderer() const
{
return GetFeatureLevel() >= ERHIFeatureLevel::SM4;
}