123456806 发表于 2020-12-23 09:47

Unreal添加自定义Pass

Unreal在编辑器中没有Pass的概念,我们在做一些诸如描边这类的 效果又需要添加Pass,这样我们就有了需要添加自定义Pass的需求了。在开始工作前有必要了解一下UE的大致渲染流程。
下图是UE4.22更新后的MeshDraw的PipeLine。




想要详细了解渲染流程,可以去听一下UE4的渲染人员做的分享https://www.bilibili.com/video/av54601189/?p=10,这里简要说一下
场景中的动态和静态模型都是一个一个 Proxy,UE会去收集这些Proxy,将其转化成MeshBatch,一个MeshBatch你可以理解为一个RenderObject。一个MeshBatch可以添加多个Processor,这个Processor你可以理解其实就是我们的Pass,但也有些许不一样。在Unity中,我们一般 认为Pass是挂在Mesh上的,一个Mesh有多个Pass。在UE中,虽然也会遍历MeshBatch,但它是让Pass去收集可用到的MeshBatch。MeshBatch的Render其实只是让各个需要用到的Pass生成DrawCommand,真正Push到显卡是在这些Command生成完,然后一个个Pass推送到显卡进行渲染。可以看出这个Pass的概念和Unity的Pass还是有很大的不同的。
声明MeshPass
打开MeshPassProcessor.h,添加我们的自定义声明




然后命名




创建Pass对应的Processor
这里,你可以自己完全创建一个自己的Processor,也可以复用MobileBasePassProcessor,自定义Processor的好处是你可以在一个新的shader文件中编写你的代码,但是需要重新绑定你所需要的一些数据。我当时做的时候想图省事,复用MobileBasePassProcessor,结果发现复用MobileBasePassProcessor也是一个特别痛苦的事情,因为MobileBasePassProcessor为了兼容各种灯光数目以前LDR和HDR等功能,用了大量的泛型,好在可以依葫芦画瓢。
打开MobileBasePass.cpp,拉到最下面。


可以看到这个就是为移动平台各个Pass注册创建Processor的方法,我们照着BasePass添加我们的MyPass。
AddMeshBatch
UE有两种MeshBatch,静态和动态,我们需要在这两种MeshBatch遍历中,把MeshBatch挂在我们的Pass上。打开SceneVisibility.cpp,在MarkRelevant方法中添加静态的MeshBatch,在ComputeDynamicMeshRelevance中添加动态的MeshBatch。


页: [1]
查看完整版本: Unreal添加自定义Pass