Pil*_*pel 3 opengl shader glsl
我完全不知道如何渲染水源(海洋,湖泊等).这就像我遇到的每一个教程都假设我掌握了这个主题的基本知识,因此抽象地讲述了这个问题,但我没有.
我的目标是在我的地形中建立一个基于高度的水位.
我找不到任何可以帮助我入门的好文章.
joz*_*yqk 16
问题非常广泛.我将它拆分为单独的组件,然后依次进行操作.希望这有助于缩小那些可能的范围,不幸的是我只能提供你不是直接追求的更高级别的讨论.
程序方法将基于某些噪声函数给出位置和时间的固定高度.一个非常基本的想法是y = sin(x) + cos(z).一些更详细的例子在GPUGems中.

就像在图像中一样,您可以通过创建网格,y在网格x,y位置采样高度()并使用三角形连接这些点来渲染几何体.
如果您明确地将所有高度存储在2D数组中,您可以创建一些相当不错的波浪和涟漪.这里的想法是使用一些简单的规则基于相邻高度更新高度.例如,每个高度朝向平均相邻高度移动,但也趋向于平衡高度等于零.为了使其工作良好,高度需要一个速度值来提供水动量.
我在这里找到了一些这种动态水的例子:
Run Code Online (Sandbox Code Playgroud)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中绘制镜像镜像?