Unity 着色器将具有相同 material 的对象渲染到后续的 GrabPasses

Unity shader to render objects with same material to subsequent GrabPasses

概述

我正在 Unity 2017.1 中开发着色器,以使 UnityEngine.UI.Image 组件能够模糊其背后的内容。

作为 this Unity forum topic, I use GrabPasses 中的一些方法,特别是 tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(<uv with offset>)) 调用来查找我在模糊求和中使用的像素。我正在做一个基本的 2-pass 框模糊,现在不打算优化性能。

这按预期工作:

我还想根据图像alpha 遮罩模糊效果。我使用 tex2D(_MainTex, IN.uvmain) 在我计算模糊的像素上查找精灵的 alpha 颜色,然后我将其与模糊的 alpha 结合。

这在处理单个 UI.Image 对象时效果很好:

问题

然而,当我有多个 UI.Image 对象共享从该着色器创建的 Material 时,上面分层的图像将切入下面的图像:

我认为这是因为具有相同 material 的对象可能会同时绘制,因此不会出现在彼此的 GrabPasses 中,或者至少不会出现类似的效果。

这至少可以解释为什么,如果我复制 material 并在其自己的对象上使用每个 material,我就没有这个问题。

这是着色器的源代码:https://gist.github.com/JohannesMP/8d0f531b815dfad07823d44bc12b8112

问题

有没有办法强制相同 material 的对象连续绘制而不是平行绘制?基本上,我希望较低对象的渲染过程的结果对后续对象的抓取过程可见。

我可以想象创建一个动态实例化 materials 的组件来强制执行此操作,或者使用渲染纹理,但我真的想要一个不需要添加组件或创建多个 materials 换出。

我喜欢一个完全独立于一个 shader/one material 中的解决方案,但不确定这是否可能。我仍然刚刚开始熟悉着色器,所以我肯定有一些我不熟悉的功能。

原来是我重新绘制了我从 _GrabTexture 中抓取的内容导致了这个问题。通过正确处理那里的 alpha 逻辑,我能够准确地获得所需的行为:

这是更新后的源代码:https://gist.github.com/JohannesMP/7d62f282705169a2855a0aac315ff381

如前所述,优化卷积步骤不是我的首要任务。