在opengl的水翻译

Pil*_*pel 3 opengl shader glsl

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

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

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

joz*_*yqk 16

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

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

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

在此输入图像描述

就像在图像中一样,您可以通过创建网格,y在网格x,y位置采样高度()并使用三角形连接这些点来渲染几何体.

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

我在这里找到了一些这种动态水的例子:

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];
Run Code Online (Sandbox Code Playgroud)

渲染:

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

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

一个例子是在这里.

在此输入图像描述

但是,当您有一个凹凸不平的表面并且反射光线受到干扰时,此方法不起作用.

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

一个例子是在这里.

在此输入图像描述

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

另请参阅:如何在OpenGL中绘制镜像镜像?