opengl中的水渲染

opengl中的水渲染,opengl,glsl,shader,Opengl,Glsl,Shader,我完全不知道如何渲染水源(海洋、湖泊等)。就像我遇到的每一个教程都假设我有这个主题的基本知识,因此抽象地谈论这个问题,但我没有 我的目标是在我的地形中有一个基于高度的水位 我找不到任何有助于我入门的好文章。问题相当广泛。我把它分成几个独立的组件,让每个组件依次工作。希望这将有助于缩小这些可能是什么,不幸的是,我只能提供更高层次的讨论,你不是直接后 波浪模拟(几何体和动画): 程序方法将根据某些噪声函数给出位置和时间的固定高度。 一个非常基本的想法是y=sin(x)+cos(z)。还有一些更详细的

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

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


我找不到任何有助于我入门的好文章。

问题相当广泛。我把它分成几个独立的组件,让每个组件依次工作。希望这将有助于缩小这些可能是什么,不幸的是,我只能提供更高层次的讨论,你不是直接后

波浪模拟(几何体和动画): 程序方法将根据某些噪声函数给出位置和时间的固定高度。 一个非常基本的想法是
y=sin(x)+cos(z)
。还有一些更详细的例子

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

如果将所有高度显式存储在二维数组中,则可以创建一些外观相当不错的波浪和涟漪。这里的想法是使用一些简单的规则,根据相邻高度更新高度。例如,每个高度朝着平均相邻高度移动,但也朝着平衡高度等于零的方向移动。要使其正常工作,高度需要一个速度值来提供水动量

我发现了一些这种动态水的例子:

致使: 对于水来说,使用alpha透明度是非常好的第一步。我从这里开始,直到你的模拟运行正常。你想要的主要效果是反射,所以我就来讨论一下。进一步,您将希望使用菲涅耳比率缩放反射值。你可能需要一种基于距离的水下吸收效果(如雾)(见比尔定律,本质上是
exp(-distance*density)
)。如果您真的很喜欢,您可能希望使用折射渲染水的下面部分。但回到思考

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

一个例子是

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

与直接将水下反射视图渲染到屏幕不同,您可以。然后,在渲染水时,就有了反射的颜色信息。棘手的部分是在计算反射向量后确定纹理中的采样位置

一个例子是

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


另请参见:

在所需高度绘制一个带有alpha混合的巨大透明蓝色四边形。这太简单了,但你想变得多复杂?@jozxyqk我希望它有可控的波高、反射、法线映射。
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];