概述
我正在 Unity 2017.1 中开发着色器以启用 UnityEngine.UI.Image组件模糊其背后的内容。
正如 this Unity forum topic 中的一些方法,我用GrabPasses ,具体来说是 tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(<uv with offset>))
调用以查找我在模糊求和中使用的像素。我正在进行基本的 2 遍框模糊,现在不打算优化性能。
我还想根据图像 Alpha 掩盖模糊效果。我用tex2D(_MainTex, IN.uvmain)
为了查找像素上 Sprite 的 Alpha 颜色,我正在计算模糊,然后将其与模糊的 Alpha 结合起来。
问题
但是当我有多个UI.Image
时共享从此着色器创建的相同 Material 的对象,上面分层的图像将切入下面的图像:
我相信这是因为具有相同 Material 的对象可能会同时绘制,因此不会出现在彼此的 GrabPass 中,或者至少会出现这种效果。
这至少可以解释为什么,如果我复制 Material 并在其自己的对象上使用每种 Material ,我就不会遇到此问题。
这里是着色器的源代码:https://gist.github.com/JohannesMP/8d0f531b815dfad07823d44bc12b8112
问题
有没有办法强制相同 Material 的对象连续绘制而不是并行绘制?基本上,我希望较低对象的渲染 channel 的结果对于后续对象的抓取 channel 可见。
我可以想象创建一个动态实例化 Material 的组件来强制执行此操作,或者使用渲染纹理,但我真的很想要一个不需要添加组件或创建多个 Material 来交换的解决方案。
我希望有一种完全独立于一个着色器/一种 Material 的解决方案,但不确定这是否可行。我才刚刚开始熟悉着色器,所以我确信有一些功能我不熟悉。
最佳答案
事实证明,是我重新绘制了从 _GrabTexture
中抓取的内容,从而导致了问题。通过正确处理 alpha 逻辑,我能够准确地获得所需的行为:
这是更新后的源代码:https://gist.github.com/JohannesMP/7d62f282705169a2855a0aac315ff381
如前所述,优化卷积步骤不是我的首要任务。
关于unity-game-engine - Unity 着色器将具有相同 Material 的对象渲染到后续 GrabPasses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52628494/