UE Mesh Draw Pipeline 解析

为什么引入Mesh Draw Pipeline

-------------作者:mx 

常规渲染管线(老的渲染管线)的弊端

①无法很好的进行排序以及剔除,以UE为例,使用位图 来表示物体可见性,无法快速找到最前面的物体,drawlist无法实现动态物体和静态物体的 draw sorting

②无法很好的进行合批。以UE为例,drawlist policy会将pso的设置以老api的方式调用draw时设置


 


 

Mesh Draw Pipeline 的目的及优势

①更好的进行缓存,减少构建耗时,减少

②更好的进行绘制调用合并

③更好的进行并行绘制

④提高缓存命中率

⑤更好的支持新技术,如DXR

-------------作者:mx 

Mesh Draw Pipeline的基本流程

简述:

以UE为例:实现预制好场景资源,通过场景资源创建对应的pso,通过场景资源代理去创建对应的MatchBatch,并在AddToBatch的时候去计算能否合批,如果能够合批会合并DrawCommand


 

具体实现:

UE

一些基础概念:

MeshProcessor


 

(并且每个pass都有一个processor)


-------------作者:mx 

生成、缓存、提交、失效

这里分为三个阶段:①FPrimitiveSceneProxy->FMeshBatch ; ②FMeshBatch->FMeshDrawCommand ; ③FMeshDrawCommand -> RHICommandList

第一阶段:FPrimitiveSceneProxy->FMeshBatch

具体路径在:

SceneRender会把当前场景的Batch全部收集到Collector中,Collector在遍历当前Scene中所有的Primitive时会创建Batch。SceneRender同时会计算一个FMeshBatchAndRelevance(存储FMeshBatch指针和FPrimitiveSceneProxy指针的结构体存入View中),也会计算一个Batch被哪些Pass应用,然后存入View中的对应计数中。

-------------作者:mx 

综上:第一阶段创建的MeshBatch会存储在Scene持有的Collector中

其他:

①FMeshBatch自身结构的一些说明:一个FMeshBatch拥有一组FMeshBatchElement、一个顶点工厂和一个材质实例,同一个FMeshBatch的所有FMeshBatchElement共享着相同的材质和顶点缓冲(可可被视为Vertex Factory)。但通常情况(大多数情况)下,FMeshBatch只会有一个FMeshBatchElement。(通过FStaticMeshSceneProxy::GetDynamicMeshElements和FSkeletalMeshSceneProxy::GetDynamicMeshElements可知,一个lod模型的一个section对应一个batch),所以在创建的时候batch并不会进行合批。

②ComputeAndMarkRelevanceForViewParallel函数也会计算物体的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值