【问题标题】:2D Water in UnityUnity 中的 2D 水
【发布时间】:2018-04-26 18:25:42
【问题描述】:

我编写了一个类似于this 的带有泉水的二维水效果。现在我想在顶点着色器(在 Unity 中)中实现它。但是对于波传播,我需要知道当前顶点的左右邻居(计算影响力),并以某种方式保存生成的力用于下一次迭代。我不知道该怎么做。

【问题讨论】:

  • 你在shader中找不到邻居。看这个tutorial希望对你有帮助
  • 感谢您的建议,我观看了教程。我已经知道这种模拟水和波纹效果的方法。 (我已经编写了这样的水着色器)但是我想用 Spring Approach 来实现这些水效果。由于无法访问 Shader 中的其他顶点,是否有其他可能的解决方案来完成这项工作?

标签: unity3d shader


【解决方案1】:

您应该为顶点操作所需的偏移创建纹理表示,然后在顶点着色器中使用 tex2lod() - 这些在着色器模型 3 及更高版本中受支持。

然后您使用片段着色器来生成或更新纹理。

您的顶点着色器可能如下所示:

sampler2D _OffsetMap;

// vertex shader
vert_data vert (appdata_base v) {
     vert_data v_out;
     float4 vertexPos = v.vertex;
     vertexPos += tex2Dlod (_OffsetMap, float4(vertexPos.xz, 0, 0));
     v_out.position = UnityObjectToClipPos (vertexPos);
     return v_out;
}

您当然也可以使用相同的 fetch 来操作顶点法线。

【讨论】:

  • 感谢您的回答,我会调查的。但是如何存储新的顶点位置,以便下次调用着色器时,我可以访问更新的顶点位置?
  • 正如我在上面所写的,您必须使用多通道设置,其中片段着色器为动画的每一帧渲染偏移纹理/置换贴图,然后将此纹理传递给顶点上面的着色器。这有时称为动态位移映射。您应该能够在网络上找到大量示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多