我完全不知道如何渲染水源(海洋,湖泊等)。就像我遇到的每个教程都假设我具有该主题的基本知识,因此抽象地谈论了这个问题,但是我没有。
我的目标是在我的地形中具有基于高度的水位。
我找不到任何可以帮助我入门的好文章。
这个问题很广泛。我将其拆分为单独的组件,然后依次使每个组件工作。希望这将有助于缩小范围,不幸的是,我只能提供您没有直接关注的更高层次的讨论。
一种程序方法将基于某些噪声函数为位置和时间给出固定的高度。一个非常基本的想法是y = sin(x) + cos(z)
。GPUGems中还有一些更详细的示例。
就像图像中一样,您可以通过以下方法渲染几何图形:创建一个grid,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];
使用Alpha透明度是水的重要第一步。我将从这里开始,直到您的模拟运行正常。您需要的主要效果是反射,所以我将介绍它。进一步,您将需要使用菲涅耳比来缩放反射值。您可能需要基于距离的水下吸收效果(例如雾)(本质上请参见比尔定律exp(-distance * density)
)。真的很喜欢,您可能需要对折射的水下部分进行渲染。但是回到思考...
渲染平面反射的最简单方法可能是模版反射,即从水下绘制场景并使用模版缓冲区仅影响先前绘制过水的像素。
这里有一个例子。
但是,当您的表面凹凸不平且反射光线受到干扰时,此方法将无效。
与其将水下反射视图直接呈现到屏幕上,还可以将其呈现为纹理。这样,您就可以在渲染水时获得反射的颜色信息。棘手的部分是在计算反射向量之后,计算出纹理中要采样的位置。
这里有一个例子。
这使用纹理,但仅用于完美的平面反射。
另请参阅:如何在OpenGL中绘制镜像的镜像?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句