opengl中的水渲染

皮尔佩尔

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

我的目标是在我的地形中具有基于高度的水位。

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

jozxyqk

这个问题很广泛。我将其拆分为单独的组件,然后依次使每个组件工作。希望这将有助于缩小范围,不幸的是,我只能提供您没有直接关注的更高层次的讨论。

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

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

在此处输入图片说明

就像图像中一样,您可以通过以下方法渲染几何图形:创建一个gridy在网格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];

渲染:

使用Alpha透明度是水的重要第一步。我将从这里开始,直到您的模拟运行正常。您需要的主要效果是反射,所以我将介绍它。进一步,您将需要使用菲涅耳比来缩放反射值。您可能需要基于距离的水下吸收效果(例如雾)(本质上请参见比尔定律exp(-distance * density))。真的很喜欢,您可能需要对折射的水下部分进行渲染。但是回到思考...

渲染平面反射的最简单方法可能是模版反射,即从水下绘制场景并使用模版缓冲区仅影响先前绘制过水的像素。

这里有一个例子

在此处输入图片说明

但是,当您的表面凹凸不平且反射光线受到干扰时,此方法将无效。

与其将水下反射视图直接呈现到屏幕上,还可以将其呈现为纹理这样,您就可以在渲染水时获得反射的颜色信息。棘手的部分是在计算反射向量之后,计算出纹理中要采样的位置。

这里有一个例子

在此处输入图片说明

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章