You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
以 Bloom 效果举例,BloomEffect 里面其实包含了** Hightlight、Blur、BloomMerge** 等 Post Process,所以需要一个比 Post Process 更高维度的概念,好处就是灵活复用各种原子后处理效果,并用入参来表示 PostProcess 的**种类和顺序,**伪代码:
背景
Unity 调研
概要:
后处理管线
后处理生效范围
Unity 是根据当前节点树的体积来的。
其中,camera 还有一个开关 Volume Mask 可以设置生效多个体积中的哪一个:
拓展后处理方法
1. Full Screen Renderer Feature
在 Unity 中拓展后处理,官方文档推荐的方式是通过
Scriptable Renderer
面板Add Renderer Feature
添加内置的Full Screen Renderer Feature
, 会保存到 Scriptable Renderer 的rendererFeatures
属性中,然后绑定材质(pass material),材质如果是 ShaderGraph 做的,
sample source
那里可以选择来源是 BlitSource,普通材质可以直接使用 _MainTexture 作为采样纹理:Render Feature 这里还提供了插入位置用来决定何时渲染这个后处理效果:
2. Custom Renderer Feature
如果官方内置的
Full Screen Renderer Feature
不能满足,还可以新建自定义 Renderer Feature 进行拓展:参考官网 Demo,代码跟 Full Screen 的差不多,拿官网的举例:
Renderer Feature:
SRP:
Shader
3. Renderer Feature + Volume
Unity 6000 版本,Unity 资产还新增了 Post-Processing Effect 模板,本质上是新建了上文说的 Renderer Feature 和 Volume 两个脚本,Volume 脚本用来控制后处理特效有哪些属性,Renderer Feature 用来创建 pass,读取 Volume 属性,执行 pass 等逻辑 。
本质上没区别,还是需要在 Assets/Settings/RendererData 添加 RenderFeature:
然后在后处理组件添加 Override:
代码也没啥差异,就是把本来一坨全写在 Renderer Feature 的代码,拆开到了 Volume 组件中,使逻辑更加清晰。
补充:CommandBuffer
概念
在前面的自定义后处理实现方案中,无论是 SRP 还是脚本方式,想要进行 Blit 操作,都用到了 CB 相关技术,CB 设计提供了一种拓展渲染管线的方法,可以立即执行或者在渲染管线的各个时机执行封装的一系列渲染命令。关于 CB 的设计并不是 Unity 独创的,在 DX,Metal 中都可以看到相似的命令缓冲区概念,至于 Unity 早期的设计考虑可以参考这篇博客。
优劣
执行时机
目前 CB 有这些渲染命令,其中 commandBuffer.Blit 在 URP 中已经被弃用,推荐使用 Blitter
目前的解决方案是基于 SRP 的 RenderPassEvent,然后在相应的管线里面手动调用 Graphics.ExecuteCommandBuffer 或者 ScriptableRenderContext .ExecuteCommandBuffer
总结
Babylon 调研
设计思路
有 4 个维度,从小到大分别是 Post Process、Effect、 Pipeline、Manager。
后处理的最小维度就是 PostProcess, Babylon 内置了一系列 XXXPostProcess 后处理特效,指定绑定到某个相机下的 pass 中,比如下图的 Blur 模糊后处理,然后用
updateEffect
来更新效果以 Bloom 效果举例,BloomEffect 里面其实包含了** Hightlight、Blur、BloomMerge** 等 Post Process,所以需要一个比 Post Process 更高维度的概念,好处就是灵活复用各种原子后处理效果,并用入参来表示 PostProcess 的**种类和顺序,**伪代码:
Pipeline 的维度就更高了,可以封装一系列 Effect,通过
Pipeline.addEffect(effect)
的方式来添加/调整顺序。 Babylon 还提供了一个专门的默认后处理管线,默认开启 HDR,里面包含了 HDR、Bloom、FXAA、DOF 等 Process 和 Effect,方便用户快速调节各种后处理,参考这个案例创建完 Pipeline 后,还需要将管道添加到 Manager 并附加到相机:
比如前面的默认后处理管线的源代码里面:
如果 Post Process 已经绑定到相机,那么后面无论是绑定到 Effect 还是 Pipeline,都是会执行后处理的,这块设计有点缺陷?像是暴露过于灵活了。
自定义后处理
如果要自己写一个后处理效果的话,参考这篇文档,总结如下:
setTextureFromPostProcess
可以拿到后处理的输出:总结
Laya 调研
创建方式
拓展方式
PostProcessRenderContext
里面保存了各种后处理状态,包括 CommandBuffer,用来 blit,切换 RT 等操作:在 mainPass 最后会调用 postProcess 的 _render() 方法,最后会调用 CommandBuffer:
然后遍历执行每个 Effect 的 render(context) 方法,并把 context 传入:
编辑器设计
https://layaair.com/3.x/doc/3D/advanced/PostProcessing/readme.html
总结
Unreal 调研
概要:
添加方式
在 Actor 面板拖入即可,且模版自带 GlobalPostProcessVolume
配置方式
拖入后,在 Details 面板可以配置相应后处理,和 Unity 差不多,Infinite Extent 勾上时对应 Unity 的 Global mode 。
Unity 使用 Profile 来共享后处理配置,Unreal 复制Actor后每一份都是 Instance,不共享配置。
整体调研总结
拓展后处理方案
从功能上看的确 Unity 最全面,但是考虑到 Unity 的3种实现方案都离不开 Renderer Feature,但是 6000 版本开始明显希望将 Volume 的逻辑从 Feature 拆开来,然后在 Volume 组件中直接添加自定义 Volume,但是由于 Feature 的历史包袱,还是需要在两个地方分别进行绑定自定义后处理。
所以我们的设计着重要解决下面几个问题:
引擎改动点:
引擎设计
编辑器设计
之前放在 Scene 面板的后处理移到 Entity 下面,作为 Component 的一种。
模版默认内置 GlobalPostProcess 节点,自带 PostComponent,Priority 为 0,isGlobal 为 true。
增强脚本参数:支持双语 Tooltip 和回调事件。
The text was updated successfully, but these errors were encountered: