【问题标题】:Texture local color accumulation/blur纹理局部颜色累积/模糊
【发布时间】:2015-12-27 19:28:29
【问题描述】:

简单来说,我希望我的自定义着色器能够在最后一帧期间访问其自己的输出,以便通过颜色累积实现伪运动模糊。尽管运动模糊根本不是正确的术语。

考虑以下情况:我有一个纹理大部分是透明的网格。纹理偏移不断变化。我现在想构建一个着色器,使用它的纹理不是跳跃,而是从它所在的位置慢慢消失。全屏模糊效果不行;模糊必须只保留在对象上,并且需要独立于相机移动。

到目前为止,我的想法是定义一个 RenderTexture,它包含在最后一帧期间生成的纹理,但是由于 RenderTexture 是由相机渲染的,因为我想要的是特定于网格的纹理,所以我不会知道如何实施。

我也尝试在着色器中使用GrabPass { },但是这似乎又抓住了整个渲染屏幕而不是纹理。

我可能误解了着色器的工作原理;如果渲染整个屏幕是唯一的选择,那么我可以将我的材质分配给一个平面并以这种方式渲染纹理,但是我不确定如何,或者更确切地说:在我的代码中,我会这样做。创建一个原始平面和一个相机只是为了让着色器工作似乎也需要很多东西才能获得一个效果,最初我认为实现起来很简单。 耸耸肩

任何帮助或指点将不胜感激,

-s_m_w

编辑:这是我想要实现的快速模拟图:

我通过操纵纹理偏移来实现当前效果。第二个效果中的“模糊”需要独立于相机移动。

【问题讨论】:

  • 你能画出你想要达到的效果吗?我无法想象想要的效果......或者更详细地解释它?
  • @ThomasHilbert 我添加了一个速写,希望能更好地解释它
  • 对象本身可以在屏幕上移动还是会保持相对于相机的恒定位置?物体是否可以被在物体和相机之间移动的其他物体所覆盖?那会发生什么?
  • 物体可以移动,并且相对于相机不会保持不变,是的,它可以被覆盖,在这种情况下它应该简单地重叠

标签: unity3d textures shader vertex-shader


【解决方案1】:

我认为您必须将效果渲染到 RenderTexture 上。 您可以在代码中创建相机。您可以将其渲染目标设置为您的 RenderTexture,并且您可以使用 OpenGL 命令(GL 类)方便地渲染全屏四边形。基本上,您可以在代码中设置完整的效果渲染基础设施。

第 1 帧: 将 EffectShader 源纹理设置为 RenderTexture1。 渲染到 RenderTexture2。 使用 RenderTexture2 使用 ObjectShader 为您的对象着色。

第 2 帧: 将 EffectShader 源纹理设置为 RenderTexture2。 渲染到 RenderTexture1。 使用 RenderTexture1 使用 ObjectShader 为您的对象着色。

重复。

【讨论】:

  • 好的,多亏了你的建议,我想我已经明白了。 :D 与您建议的方式不太一样,但您的回答给了我所需的技巧。我没有将材质渲染到平面上,而是将相机放置在对象的正上方。滥用我使用正交投影的事实,我只是渲染了在屏幕上看到的对象,将其保存在 RenderTexture 中并将其提供给我的着色器。由于着色器使用世界坐标进行操作,这让我免于以某种方式处理它。结果是in a YT video
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多