我目前实现了一个自上而下的海洋视图游戏。我使用以下一些抽象的纹理:
实际的纹理是透明的,我添加了绿色的颜色来澄清.
我现在的问题是,我不知道如何动画这个纹理,所以水看起来很好。我试图用正弦波来移动纹理:texture.y += sin(angle)
。当然,现在整个纹理都在移动,这看起来有点不切实际。接下来,我尝试添加另一个层并实现视差效果。所以水面下的反射也会移动,但要慢得多。看起来好多了但还是没有..。够好的。
我认为最好的动画是,如果单个细胞扩张和收缩,有点像一张网或一块布。想象一下,如果有人稍微拉到这些细胞的一个顶点,而相邻的细胞会膨胀,而我拉向(或推到)的细胞会收缩。有点像弹簧网。但我不知道如何实现这样的东西:
(我对如何将给定的纹理动画化也有不同的想法和答案。现实主义不是重点,只是一些漂亮的水般的动作.)
我在这篇文章中发布了一个libgdx示例:二维水动画参差不齐,不光滑。 (参见关于纹理过滤的答案)
发布于 2018-09-14 12:06:11
这样做的一个常见方法是在着色器中使用间接纹理查找来扭曲显示纹理:
这里我使用了一个纹理,带有一些低频的颜色噪声(平铺平滑的随机颜色斑点),并随着时间的推移在显示几何图形上滚动。
我不是从这个纹理中画出颜色,而是把红色和绿色通道减去0.5f
,把它们变成一个伪随机的2D矢量,随着时间和空间的变化而平稳地变化。
然后,我可以添加一个小倍数的这个矢量到我的紫外线坐标,然后从主要的水的纹理取样。这改变了我们正在阅读的纹理的一部分&显示,扭曲它。
通过平均两个样本从这个噪音,滚动向相反的方向,我们可以隐藏方向的运动,所以它只是看起来像无目标晃动。
在“统一”中,着色器应该是这样的--它应该足够简单,可以翻译成您选择的着色语言:
fixed4 frag (v2f i) : SV_Target
{
float2 waveUV = i.uv * _NoiseScale;
float2 travel = _NoiseScrollVelocity * _Time.x;
float2 uv = i.uv;
uv += _Distortion * (tex2D(_Noise, waveUV + travel).rg - 0.5f);
waveUV += 0.2f; // Force an offset between the two samples.
uv += _Distortion * (tex2D(_Noise, waveUV - travel).rg - 0.5f);
// Sample the main texture from the distorted UV coordinates.
fixed4 col = tex2D(_MainTex, uv);
return col;
}
发布于 2018-09-14 11:58:28
这被称为焦散效应,并且在运行时生成这些效果相当耗时,因此传统上这是通过预先呈现的逐帧动画来完成的。有一些工具会为你生成焦散动画帧,比如焦散发生器,它有一个免费的非商业版本。还有一些预先制作的工具,你可以买到比我提到的工具的专业版本便宜得多。
注意,烧焦效应通常也是一种在水下地形或水下表面应用的轻曲奇效应。也就是说,把它放在水面上,而向下看它,通常不是什么样子的水。
发布于 2018-09-14 13:55:38
这看起来像从voronoi图生成的纹理,例如:
您可以通过移动点对图形进行小的、平滑的调整;重新绘制每个帧的图形将非常昂贵,因此您可能想要预渲染动画。
https://gamedev.stackexchange.com/questions/163689
复制相似问题