opengl中的水渲染
Water rendering in opengl
我完全不知道如何渲染水源(海洋、湖泊等)。就好像我遇到的每一个教程都假设我有这方面的基础知识,因此抽象地谈论这个问题,但我没有。
我的目标是在我的地形中有一个基于高度的水位。
我找不到任何可以帮助我入门的好文章。
这个问题很宽泛。我会把它分成单独的组件,然后让每个组件依次工作。希望这将有助于缩小可能的范围,不幸的是,我只能提供您没有直接关注的更高级别的讨论。
波浪模拟(几何和动画):
程序方法将根据一些噪声函数为位置和时间提供固定高度。
一个非常基本的想法是y = sin(x) + cos(z)
。 GPUGems.
中有一些更详细的示例
就像在图像中一样,您可以通过 creating a grid、在网格 x,y
位置采样高度 (y
) 并用三角形连接这些点来渲染几何体。
如果您明确地将所有高度存储在一个二维数组中,您可以创建一些非常漂亮的波浪和涟漪。这里的想法是根据相邻高度更新高度,使用一些简单的规则。例如,每个高度都向平均相邻高度移动,但也趋向于平衡高度为零。为了使其正常工作,高度需要一个速度值来提供水动量。
我找到了一些这种动态水的例子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 透明度是处理水的重要的第一步。我将从这里开始,直到您的模拟 运行 OK。您想要的主要效果是反射,所以我将只介绍它。接下来,您将需要使用菲涅尔比来缩放反射值。您可能需要基于距离的水下吸收效果(如雾)(参见比尔定律,本质上是 exp(-distance * density)
)。变得非常花哨,您可能想要使用折射来渲染水的下方部分。但回到思考...
渲染平面反射的最简单方法可能是模板反射,您将从水下绘制场景并使用模板缓冲区仅影响您之前绘制过水的像素。
一个例子是here.
但是,当表面不平且反射光线受到扰动时,此方法不起作用。
您可以 render it to a texture 而不是直接将水下反射视图渲染到屏幕上。然后当你渲染水时,你就有了反射的颜色信息。棘手的部分是在计算反射向量后计算纹理中的采样位置。
一个例子是here。
This 使用纹理但只是为了完美的平面反射。
另请参阅:How do I draw a mirror mirroring something in OpenGL?
我完全不知道如何渲染水源(海洋、湖泊等)。就好像我遇到的每一个教程都假设我有这方面的基础知识,因此抽象地谈论这个问题,但我没有。
我的目标是在我的地形中有一个基于高度的水位。
我找不到任何可以帮助我入门的好文章。
这个问题很宽泛。我会把它分成单独的组件,然后让每个组件依次工作。希望这将有助于缩小可能的范围,不幸的是,我只能提供您没有直接关注的更高级别的讨论。
波浪模拟(几何和动画):
程序方法将根据一些噪声函数为位置和时间提供固定高度。
一个非常基本的想法是y = sin(x) + cos(z)
。 GPUGems.
就像在图像中一样,您可以通过 creating a grid、在网格 x,y
位置采样高度 (y
) 并用三角形连接这些点来渲染几何体。
如果您明确地将所有高度存储在一个二维数组中,您可以创建一些非常漂亮的波浪和涟漪。这里的想法是根据相邻高度更新高度,使用一些简单的规则。例如,每个高度都向平均相邻高度移动,但也趋向于平衡高度为零。为了使其正常工作,高度需要一个速度值来提供水动量。
我找到了一些这种动态水的例子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 透明度是处理水的重要的第一步。我将从这里开始,直到您的模拟 运行 OK。您想要的主要效果是反射,所以我将只介绍它。接下来,您将需要使用菲涅尔比来缩放反射值。您可能需要基于距离的水下吸收效果(如雾)(参见比尔定律,本质上是 exp(-distance * density)
)。变得非常花哨,您可能想要使用折射来渲染水的下方部分。但回到思考...
渲染平面反射的最简单方法可能是模板反射,您将从水下绘制场景并使用模板缓冲区仅影响您之前绘制过水的像素。
一个例子是here.
但是,当表面不平且反射光线受到扰动时,此方法不起作用。
您可以 render it to a texture 而不是直接将水下反射视图渲染到屏幕上。然后当你渲染水时,你就有了反射的颜色信息。棘手的部分是在计算反射向量后计算纹理中的采样位置。
一个例子是here。
This 使用纹理但只是为了完美的平面反射。
另请参阅:How do I draw a mirror mirroring something in OpenGL?