unity-game-engine - Unity 着色器将具有相同 Material 的对象渲染到后续 GrabPasses

标签 unity-game-engine shader blur masking

概述

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

正如 this Unity forum topic 中的一些方法,我用GrabPasses ,具体来说是 tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(<uv with offset>))调用以查找我在模糊求和中使用的像素。我正在进行基本的 2 遍框模糊,现在不打算优化性能。

这按预期工作: enter image description here

我还想根据图像 Alpha 掩盖模糊效果。我用tex2D(_MainTex, IN.uvmain)为了查找像素上 Sprite 的 Alpha 颜色,我正在计算模糊,然后将其与模糊的 Alpha 结合起来。

当仅使用一个 UI.Image 时,效果很好。目的: enter image description here

问题

但是当我有多个UI.Image时共享从此着色器创建的相同 Material 的对象,上面分层的图像将切入下面的图像: enter image description here

我相信这是因为具有相同 Material 的对象可能会同时绘制,因此不会出现在彼此的 GrabPass 中,或者至少会出现这种效果。

这至少可以解释为什么,如果我复制 Material 并在其自己的对象上使用每种 Material ,我就不会遇到此问题。

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

问题

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

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

我希望有一种完全独立于一个着色器/一种 Material 的解决方案,但不确定这是否可行。我才刚刚开始熟悉着色器,所以我确信有一些功能我不熟悉。

最佳答案

事实证明,是我重新绘制了从 _GrabTexture 中抓取的内容,从而导致了问题。通过正确处理 alpha 逻辑,我能够准确地获得所需的行为:

enter image description here

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

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

关于unity-game-engine - Unity 着色器将具有相同 Material 的对象渲染到后续 GrabPasses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52628494/

相关文章:

java - Google Play 游戏服务 VS Google Drive

macos - Unity项目没有解决方案文件

opengl - 在 SDL2 中使用 GLSL 着色器

jquery - 使用 jQuery 在 Firefox 和 Internet Explorer 中呈现模糊的文本

css - 你能模糊 div 下面/后面的内容吗?

c# - 如何在运行时更新中仅在需要时更新列表?

c# - 如何通过名称查找同级游戏对象; Unity2d C#

c++ - 编译着色器时出错 - DirectX11

ios - 数组下标不是整数错误

jquery - 仅在 X 轴上模糊