我完全不知道如何渲染水源(海洋,湖泊等)。就像我遇到的每一个教程都假设我掌握了这个主题的基本知识,因此抽象地讲述了这个问题,但我没有。
我的目标是在我的地形中建立一个基于高度的水位。
我找不到任何可以帮助我入门的好文章。
答案 0 :(得分:15)
问题非常广泛。我将其拆分为单独的组件,然后依次进行操作。希望这有助于缩小这些可能的范围,不幸的是,我只能提供你不能直接进行的更高级别的讨论。
程序方法将根据某些噪声函数给出位置和时间的固定高度。
一个非常基本的想法是y = sin(x) + cos(z)
。一些更详细的例子在GPUGems。
就像在图片中一样,您可以按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。
然而,当你有一个凹凸不平的表面并且反射光线被扰动时,这种方法不起作用。
您可以render it to a texture而不是将水下反射视图直接渲染到屏幕上。然后,在渲染水时,您可以获得反射的颜色信息。棘手的部分是在计算反射矢量后在纹理中的哪个位置进行采样。
一个例子是here。
This使用纹理,但仅用于完美的平面反射。