游戏中水的渲染技术系列一

笔者介绍:姜雪伟 , IT公司技术合伙人 , IT高级讲师 , CSDN社区专家 , 特邀编辑 , 畅销书作者 , 国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《实战核心技术详解》电子工业出版社等 。
CSDN视频网址:
水的渲染一直是图形学需要解决的问题 , 网上也有很多关于这方面的技术实现 , 本博客的系列文章也是给读者做一个总结 , 本篇博客主要介绍用傅里叶变换算法实现的水反射 , 也是一种假反射效果 , 目的是优化效率 。实现的效果如下图所示:
【游戏中水的渲染技术系列一】

游戏中水的渲染技术系列一

文章插图
使用傅里叶系数来表示地形高度的假反射效果 , 
在我们开发的游戏中使用水着色器 , 告诉读者我将如何利用引擎处理水的反射 , 我们自己开发水渲染效果 , 需要在优化方面考虑 , 计算每帧渲染时间 。
我们要处理渲染简化的低分辨率反射地图 , 因为我们还要渲染对于流动的水平面 。
算法的实现其实都是源于生活 , 大家如果平时出去旅游 , 经常会看到山丘的反射 , 近处反射的比较清晰 , 但在远处它只是一个黑色的斑点 。试想一下 , 如果我们能够记录每个水点周围的水面上方的地形的角度 , 然后我可以在水着色器中使用这个反射光线 , 它应该是从“天空”过渡到“地形”的点 。
( )球面谐波是一种众所周知的技术 , 通常用于全局照明 。非常简要地总结:每个顶点存储一组预先计算的系数 , 这允许我们重建击中对象的环境光 。这些系数基本上存储从每个方向照射该点的光的映射图 。反射/环境光通常是非常低的频率 , 因此这是这些系数如何包含这么“多”的信息原因 。
我决定用我引擎中的水尝试类似的技术 , 每个顶点保存一组小系数 , 描述地形在水上方围绕该点的每个方向上升的角度 。这可以用一个四元系列
的系数来描述 - 基本上是球面谐波的2d方程 。当在顶点之间插值时 , 这些傅里叶系数就可以计算出来了 , 给读者展示一下效果图吧 。
游戏中水的渲染技术系列一

文章插图
在水上的一个点周围的采样方向上的各种角度 。
我们计算每个水顶点的系数 , 这涉及每个顶点的操作:
1、在点周围选择 k个均匀间隔的采样方向 。k的值只影响计算 , 因此您可以将其设置为一定
的高以实现其仿真度 , 我目前使用13 。
2、对于每个采样方向 , 执行光线跟踪 。一次执行一个高度地图像素 , 测量水面上方的地形角度 。
你想要精确的反射取决于你离岸的距离 , 在本文的示例应用程序中 , 我目前使用5个像素 。
如果你的游戏涉及从低水平面的不同的水观察视角 , 你将需要使用更多(后面更多) 。
3、现在我们有一个函数(每2π循环)表示点周围的地形高度 。
4、为了获得表示该函数的傅里叶系数 , 我们需要对每个系数的表达式进行积分计算 , 确切的表达式可以在网
上找到 。我使用数值积分 , 分辨率为400(例如每个函数400个样本) , 使用的数字仅影响计算 。
5、我计算前8个系数 , 这个数字直接影响效果的品质和性能 。8对我的目的来说肯定够好了 , 当然我们会尽量降低 。