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;
}