在opengl的水翻译

时间:2015-06-05 07:56:02

标签: opengl glsl shader

我完全不知道如何渲染水源(海洋,湖泊等)。就像我遇到的每一个教程都假设我掌握了这个主题的基本知识,因此抽象地讲述了这个问题,但我没有。

我的目标是在我的地形中建立一个基于高度的水位。

我找不到任何可以帮助我入门的好文章。

1 个答案:

答案 0 :(得分:15)

问题非常广泛。我将其拆分为单独的组件,然后依次进行操作。希望这有助于缩小这些可能的范围,不幸的是,我只能提供你不能直接进行的更高级别的讨论。

波浪模拟(几何和动画):

程序方法将根据某些噪声函数给出位置和时间的固定高度。 一个非常基本的想法是y = sin(x) + cos(z)。一些更详细的例子在GPUGems

enter image description here

就像在图片中一样,您可以按creating a grid渲染几何体,在网格y位置渲染高度(x,y)并将这些点与三角形连接。

如果您明确地将所有高度存储在2D数组中,您可以创建一些相当不错的波浪和涟漪。这里的想法是使用一些简单的规则基于相邻高度更新高度。例如,每个高度朝向平均相邻高度移动,但也趋向于平衡高度等于零。为了使其运作良好,高度需要一个速度值来给出水势。

我找到了一些这种动态水的例子here

height_v[i][j] += ((height_west+ height_east + height_south + height_north)/4 - height[i][j]);
height_v[i][j] *= damping;
height[i][j] += height_v[i][j];

渲染:

使用Alpha透明度是水的第一步。我从这里开始,直到您的模拟运行正常。你想要的主要影响是反思,所以我只是掩盖它。此外,您还希望使用菲涅耳比例缩放反射值。您可能希望根据距离在水下吸收效果(如雾)(参见比尔定律,基本上是exp(-distance * density))。得到真正的幻想,你可能想要用折射渲染水的下面部分。但回到思考......

渲染平面反射的最简单方法可能是模板反射,您可以从水下绘制场景,并使用模板缓冲区仅影响您之前抽取水的像素。

一个例子是here

enter image description here

然而,当你有一个凹凸不平的表面并且反射光线被扰动时,这种方法不起作用。

您可以render it to a texture而不是将水下反射视图直接渲染到屏幕上。然后,在渲染水时,您可以获得反射的颜色信息。棘手的部分是在计算反射矢量后在纹理中的哪个位置进行采样。

一个例子是here

enter image description here

This使用纹理,但仅用于完美的平面反射。

另请参阅:How do I draw a mirror mirroring something in OpenGL?