公告

联系我:我的126邮箱: billhsu。 Locations of visitors to this page
<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

  • 随笔 - 41
  • 文章 - 0
  • 评论 - 82
  • 引用 - 0

常用链接

留言簿(16)

随笔分类

随笔档案

相册

Game Dev

搜索

  •  

最新评论

阅读排行榜

评论排行榜

GPU水面模拟
先上个自己实现的水面模拟图:


效果比较简单,只是模拟了下水面的反射效果。折射与Fresnel系数没有考虑。

水面模拟大致需要分这么几步:
1.剪裁掉水面以下的顶点[gpu里的clipplane要注意转换到Clip Space],
将摄像机放到同原摄像机关于水面对称的位置,比如原来摄像机在(x,y,z),
此时就该把摄像机放在(x,-y,z),up向量也要设置成向下的。
再把场景渲染到Render Target的纹理上(我用的纹理大小是256*256),不知道为什么Render Target的纹理大小不能超过窗口大小,超过的话渲染会出错,知道的大大告诉我一下哈。

于是,就得到了这样一个纹理:


2.将上面得到的纹理与水面的顶点对应.
把Vertex Shader中乘过变换矩阵后的坐标传到Pixel Shader,
在PS中计算
        float2 clipspace = input.Coord.xy / input.Coord.w;
        clipspace.x=((clipspace.x * 0.5f) + 0.5f);
        clipspace.y = ((clipspace.y * -0.5f) + 0.5f);
        clipspace.x=1-clipspace.x;
既可以让水面顶点与纹理对应,然后再想办法把纹理坐标扰乱来模拟水面波动。

3.再渲染一次场景就可以了。

大家也可以参考下Azure的水面渲染源代码:
http://www.azure.com.cn/article.asp?id=186

posted on 2010-03-23 20:59 Bill Hsu 阅读(1970) 评论(0)  编辑 收藏 引用 所属分类: C/C++Game DevAlgorithm


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理