一种实时海水的实现

http://www.cnblogs.com/ArenAK/archive/2007/11/07/951713.html

一种实时海水的实现(Impletention of ocean water based on projected grid)

Posted on 2007-11-07 09:02 任程 阅读( 5341) 评论( 18) 编辑 收藏
    这是2004年的一个海水实现,速度虽然不算快,但很漂亮,是用D3D写的,原网址: http://fileadmin.cs.lth.se/graphics/theses/projects/projgrid/

    自己用Ogre实现了一下,可以同时跑在OpenGL和D3D下了,但似乎D3D的效果要略好一点,精度更细致,天空盒的采样也没有裂缝,搞不懂为什么:) 在最后的效果上减少了一点,因为我基本不需要折射,只采用了反射,另外还没加太阳光的反射。

    这个实现中作者采用了"projected grid"的方法,此方法的好处是能使海面总能充满整个视野,也就是说海面的网格总是跟着视点在实时扩展的,永远走不到海的边界(这不正是有时候我们需要的吗?)它利用摄像机和海平面的位置来反算出当前为了让海面充满视野所需要的网格顶点位置,这些网格顶点在投影计算后在视口(viewport)内是均匀分布的点。我在程序中使用了128*256的网格,也就是128*256*2个三角形。

    这里是实现步骤的要点:
    1. Use projected grid concept to caculate the 4 corners' positions of the ocean base plane. Through interpolation get all the mesh  vertices's XZ coordinates.
    2. Use 8 octaves of Perlin Noise, sum them up, and sample the noise to generate height field(Y coordinate).
       Render the height to a RTT(Render to Texture).
    3. Sample the heightmap to get the neighbor's height. Generate the normal vector by cross product of neighbors' coordinates.
       Render the normal to a RTT.
    4. Make use of normalmap to get per-pixel normal vec and thus determin the reflection vector,which is used to sample the sky cube.
    It's done!

    实现效果:


    到我做的这一步,肯定有许多可以优化的地方,只是对我自己来说暂时还没有必要,所以先搁下。另外Ogre自带的Ocean_Demo的计算速度很快,用的是GPU Gems中的方法,或许可以将Projected Grid方法和它结合一下。不知可否有人实现,或者大家现在都在用什么方法?

ps:很重要的,感谢滨姐帮忙调程序:)
--ArenAK--
分类: Graphics
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值