OpenGL水面波动的设计与实现

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_23069037/article/details/78507235
学习了这么多图形学的知识。一直琢磨着搞个游戏出来。奈何美术功底并不好而且时间比较紧迫便改成渲染一些图形学具有实验性的场景。于是我就选择了水面模拟作为我开始渲染的第一步。

网络上关于水面模拟的资料很不详细。很多都是简单的说一下思路而没有详细的源代码。我参考的是GPU GEMS上的第一章关于水面模拟的内容。在我刚学图形学的时候。就把《GPU GEMS》和《pbrt》这种英文大部头当成“禁书”。总感觉这些东西的难度非常高。实际在做这个特效的时候感觉到的确有难度。但不会让人感到夸张。

闲话少说。下面我会简单的阐述一下我是如何实现我的效果。

我使用的是gem gems第一章的前两个公式。看过的小朋友会惊讶。前两个公式就是正弦波公式。难道就这么简单么?对,就是这么简单。在我实现的过程中发现用这两个简单公式就已经能模拟出很棒的水面效果了(我才不会说是我看不懂后面更复杂的公式呢。)

用一组参数来定义波:

· 波长L:波峰到波峰的长度 频率w = 2π/L

· 振幅A:波峰到水平面的高度

· 速度S:波峰每秒移动速度。相位常量φ=2π*S/L

· 方向D:波峰移动方向的水平向量(一个二维向量)

(这一段我是参考知乎内另一篇文章写的。在GPU GEMS网站上给的公式是错误的,坑。)

公式一:

这个公式就是求Z值。模拟水面波动时每个点的x与y不变 z值通过正弦变化而表现出不同高度。如果一个水波显得太单调。可以让不同方向的水波简单相加去实现复杂的波动。公式如下:


就是这么简单。而在渲染阶段我发现100X100个点每一帧直接算出每个Z值帧数只能到个位数(这应该算是实时渲染吧)。于是我改成事先计算好。然后采用不同的vbo去渲染。帧数虽然上来了。但是内存占了700多M。以前写普通应用的时候没感受到这种计算机资源不足的情况。自从学了图形学这种情况是家常便饭了。做了这个东西对我帮助很大,这是我第一次看懂复杂的英文论文和资料。学习图形学只要找到合适的方法就会事半功倍。
如果想获取详细代码或者思路。请私信我。
以下是实现效果。

展开阅读全文

没有更多推荐了,返回首页