在UE4的渲染管线中,initview起到了重要的作用,主要是对render的数据装配功能。

其主要作用有

  • 初始化和构建view,primitive,反射体,阴影等几乎所有的渲染数据
  • 进行可见性检测,对静态物体和动态物体做MeshBatch的搜集或生成,构建渲染提交管线。

首先要明确的就是这里的view是什么,view在UE4渲染中代指的是一个渲染窗口,例如对数据结构TArray<FViewInfo>和FSceneViewFamily来说,多数情况下都为一。主要作用是定义视口viewport的属性和内容。

  • 显示模式,如线框,光照,无光照,仅灯光等等
  • FRenderTarget,最终用于显示的renderTarget等

对于FViewInfo会有视口的长宽,绝大多数的标志位,和Primitive的所有类型掩码(可见性等)。而函数名称之所以叫做initview,操作的主体其实就是这里的不同的view。

PreVisibilityFrameSetup

  • 更新mesh,初始化FXSystem
  • 选中物体高亮。构造FViewElementPDI,然后使用内部函数DrawLine。原理是加入到view里的FBatchedElements TopBatchedViewElements中,这个是渲染view中不被遮挡的东西。其渲染位置需要非常靠后。主要是在与editor相关的pass进行的渲染
  • HitProxy,
  • HitProxyOpaqueOnly,
  • EditorSelection,

设置动态模糊参数,设置global dither fade in and fade out参数,不是很关心。

ComputeViewVisibility函数

  • ComputeViewVisibility是最重要的函数,
  • 初始化函数mask函数,更新反射数据。
  • 更新需要更新的staticMesh。首先Remove掉自己的Cache的commend,然后进行Cache自己的Commend,Commend信息存储在自身的FPrimitiveSceneInfo当中。
  • 更新分层细节级别(HLOD),UpdatePrimitiveFading
  • 可见性检测,其中分离StaticMesh和DynamicMesh由于一个不需要更新,而一个是每帧都会进行重新获取DynamicMeshElementsPassRelevance

更新反射数据

其主要作用是对场景中的反射物体进行搜集。处理的数据主要是scene里面的

FReflectionEnvironmentSceneData ReflectionSceneData;

主要有三种,分别是Sphere、Box、Plane,分别进行处理。

对静态Mesh进行更新

这里需要注意的是,静态Mesh的更新列表存在于PrimitivesNeedingStaticMeshUpdateWithoutVisibilityCheck中,而这个列表仅在添加进入scene时才进行,所以对于staticMesh,没有标记为更新的话,不会重新CacheCommend。所以对于静态物体在运行时如果需要更新其渲染状态,需要进行更新状态位的标记

可见性检测

ComputeAndMarkRelevanceForViewParallel,在这里进行可见性的检测。默认是多线程,将物体分为几等份,装入Packets然后处理。

对于每个盒子,都有一些特有的标志序列,共日后使用

  • RelevantStaticPrimitives:表示是静态物体
  • NotDrawRelevant,这一类表示的是其为ReflectionCapture或者是不会被渲染的物体。
  • OutHasDynamicEditorMeshElementsMasks,这一类是编辑器的,都是最后才draw
  • VisibleDynamicPrimitivesWithSimpleLights:表示动态灯光
  • OutHasViewCustomDataMasks:镖师是否使用了自定义结构
  • TranslucentPrimCount:标记透明物体
  • TranslucentSelfShadowPrimitives:标记透明自阴影

等等.之后,在MarkRelevant会对他们进行分批的注入到pass中。这里要注意的是,在这时只进行了可见的staticmesh的拆分。

最终的Commend存储在DrawCommandPacket。

GatherDynamicMeshElements

这里主要对所有的Dynamic物体进行标记和整合。当然使用的之前可见性剔除的数据信息。这里的每一个Mesh会每帧动态的更新自己的所有信息,而不是像Static进行缓存

建立pass管线

这里试我们组装数据的最后一步,直接调用FParallelMeshDrawCommandPass::DispatchPassSetup函数来进行所有之前数据的拼装和搭配。

CreateIndirectCapsuleShadows

这里主要惊醒bCastDynamicShadow,bCastStaticShadow的数据的搜集,主要使用在阴影当中。

PostVisibilityFrameSetup

这里主要惊醒灯光的裁剪,没有使用到的灯光将会被删除

SetupVolumetricFog