现在的位置: 首页 > 综合 > 正文

3D游戏场景DEMO——添加水体效果

2014年01月18日 ⁄ 综合 ⁄ 共 1098字 ⁄ 字号 评论关闭

    好久没写了,5月初就把地形弄差不多了,后来几天把天空穹改了下,弄了多重纹理云彩飘动。

    之后一直在做水体的实现,发现水体太烦了。原以为比较简单没地形复杂,结果一查阅资料,天呐~~比地形复杂多了。和地形也有相似的地方LOD之类的,也许是本来对图形方面的不了解。看了海水生成的方式——2D水波方法、正弦波叠加、FFT(快速博立叶变换)、柏林噪声、还有《游戏编程精髓6》上的“GPU交互式流体”。脑壳那个大呀,一开始太茫然了。=.=

    考虑了实际情况,决定先尝试了“正弦波叠加法”产生水的波浪效果,用VS和PS试了下,虽然是可行,但是感觉重复性太大了。当采用单方向的波传播方式时,多个波相叠加后产生的波浪效果就是重复的,与水平面角度不大时 看上去还好,如果是俯视水平面看着就不真实了。

     而采用以圆的方式扩散传播时,只有在距离波源不是很远时才能达到比较真实的效果,远了以后波长不知道怎么的会变短,就会发生很尖锐的效果。同时考虑到场景中多个水体并非一个波源,而且在河流和海水(4周环绕的)中时波源和不同单独水体块的衔接感觉不好处理,还担心计算顶点偏移会耗时间。(我机子太差)

     所以最后就没采用动态网格,只通过动态纹理来产生了水波效果。嘿嘿^_^

     使用了“GPU交互式流体”中在水波静态时产生水波效果的方法,通过法线贴图对水体纹理进行水波干扰。采用一个波浪类型的法线纹理,在VS中计算出UV坐标,在PS中取得法向量(Y为0)。将法向量XZ平面的值作为折射图和反射图的UV坐标的偏移量,如此这般,水体纹理颜色值就有些波浪的扭曲效果了。(我想游戏中部分的武器特效空间扭曲效果,应该和这类似吧?)

    水体的折射图则采用RTT(渲染到纹理),当前摄像机位置所看到的地形渲染到折射图纹理中。(虽然剔除了部分但仍很耗时,还需要优化)

    水体反射图也是RTT,把水平面作为裁剪平面SetClipPlane,渲染时要屏蔽掉地形在水以下的部分,计算出水平的反射矩阵D3DXMatrixReflect,将地形镜像翻转后设置背面剔除为顺时针剔除进行渲染。这时,相当于我门从地下从水下往上看能看到的东西就是水反射的东西,需要注意的是裁剪水平面的正方向设置b=-1向下,这个SetClipPlane函数起的效果是,保留平面正半区内容,剔除掉平面负半区的内容。(仔细想一下不难想^_^)。同时反射渲染时先渲染地形再是天空,也需要优化减少渲染地形的大小,很耗时。

    5月初到前段时间都没啥状态,这几天终于弄出点成果了,天气也好,开心啊。^_^,下面放上效果图。

    

    网站好像有问题 不让放图片

   

抱歉!评论已关闭.