5: [learn]实时渲染深入探究一文中,提到过,Culling分为如下几种:

  • Distance Culling(距离剔除,可以逐物件的设置Desired Max Draw Distance,也可以通过Cull Distance Volume统一设置不同size物件的Cull Distance-Current Max Distance,UE4默认关闭,建议将其开启)
  • Frustum Culling(视锥体剔除,逐物件,默认开启)
  • Precomputed Visibility(预计算可见性,默认关闭,通过setting->world setting->precomputed visibility打开,然后增加一个precomputed visibility volume,并将其中分成格子(格子的大小可以在world property中设置,格子高度可以在lightmass的ini配置文件中设置),通过lightmass building,计算出每个格子能看到哪些对象)
  • Occlusion Culling(遮挡剔除,精准检测每个对象的可见性,但会消耗很多性能-可以用Freezerendering做测试,将遮挡冻结)。可以用stat initviews可以看到遮挡计算的耗时和多少个物件被遮挡。当对象超过10000个,就会开始影响性能。当对象数量在30000-60000之间,单单计算遮挡关系,就会产生比较大的性能消耗。

网上关于culling的讨论也有很多,我觉得很好的内容有:剔除:从软件到硬件-洛城 适合于移动平台的预计算遮挡剔除-网易游戏雷火事业群Hierarchical Z-Buffer Occlusion Culling到底该怎么做?-mike以及UE4官方文档等。浅谈软遮挡剔除-will Yan使用Unity DXR加速PVS烘焙-zhing2006

HOC Culling的主体部分在:OcclusionCull->FMobileSceneRenderer::RenderOcclusion(AllocateOcclusionTests、BeginOcclusionTests、FSceneRenderer::FenceOcclusionTests)->FSceneRenderer::WaitOcclusionTests。开关为:r.AllowOcclusionQueries

Distance Culling、Frustum Culling、SOC Culling的主体部分在:FMobileSceneRenderer::Render->InitViews->ComputeViewVisibility

  • PVS: View.PrecomputedVisibilityData = ViewState->GetPrecomputedVisibilityData(View, Scene);
  • Frustum Culling: FrustumCull(Scene, View)。无开关
  • SOC:
    • OnStartRender->ConditionallyAllocateSceneSoftwareOcclusion->FSoftwareOcclusion::Init。开关:r.Mobile.AllowSoftwareOcclusion
    • OcclusionCull(RHICmdList, Scene, View, DynamicVertexBuffer);->FSoftwareOcclusion::Process(FSoftwareOcclusion::FlushResults->SubmitScene->ApplyResults)

虽然并非全部原创,但还是希望转载请注明出处:电子设备中的画家|王烁 于 2021 年 10 月 8 日发表,原文链接(http://geekfaner.com/ue4/blog10_culling.html)