泥巴

      —— Welcome to ivan's blog

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

    最近做水的渲染,几经波折,今天终于做出来了,下面给大家看几张截图:

 

 

限制了折射距离,纯白色表示折射可视度为0

 


边缘过度处理,和水下深度的实现

 

 

 

深度图

 

当前水面网格用的是32X32,也可以用1X1

 

水的参数设置面板,目前只实现了红线以上的功能

 

 

 

    从开始到现在已经花了1个多月的时间了,国庆节也一直在弄,现在看到这个成果,感觉还是值得的。

其实单单的水实现比较简单的,我用的是Gamebryo引擎,实现过程复杂的是引擎的渲染流程和引擎的使用(特别是shader tree)。

一开始花了不少时间去研究下面列出的参考例子,然后决定直接移植Hydrax,因为它比较完善,但是效率很低。

从研究Hydrax到移植它,花了三个星期,结果失败告终,得到的教训就是:打死我以后也不去移植别人的代码了。

放弃了Hydrax后就开始从0坐起,渲染反射,折射,深度贴图。理论上这个是比较简单的,但是我却在这个上面花了不少时间,

我在这里唠叨一下GB,GB的相机太恶心了,尽出些莫名其妙的问题,没办法设置相机的裁减面板,没办法拿到View, Projection矩阵

最终到官方论坛了解到需要自己获取DX设备来获取和设置这些,太恶心了,太恶心了,鄙视!(OGRE的相机很方便很强大啊!)

接下来的就是不断的调BUG,修改接口,修改暴露的参数,集成到GB的ToolBetch里面去,最终,今天完成了水的基本功能~

这么坎坷的过程,得到现在的成果,激动不已,所以稍微高调点到这里来晒一下,还望大虾们不要鄙视小弟!

 

从上面的图片里面看得出几个问题,还望大虾们多多指教:

1. 水面在边缘的地方有裂缝(已经在渲染折射和反射的时候把裁剪面做了偏移了,凹凸不平的地方就没办了)

2. 渲染深度图的时候,半透明物体会把整个网格的深度显示出来

3. 边缘过渡我是根据深度作为最终颜色和反射图采样的系数,这样会导致在浅水区反射图有两个

伪代码: FinalColor为已经用反射、折射做了菲尼尔混合的结果

float depth = tex2D(sDepth, projTexCoord);

float3 Reflection = tex2D(sReflection, projTexCoord);

oColor = lerp(Reflection , FinalColor, depth);

 

接下来就是解决这些问题和完善水的其他功能:Foam, caustics, underwater, gadrays, perlin, fft

 

参考例子:(这是我制作过程中收集到的例子,个人觉得已经非常全了,希望对大家有所帮助)

http://www.vterrain.org/Water/

GPU GEM 1:Effective Water Simulation from Physical Models, 2002

GPU GEM 2:Generic Refraction Simulation,  2005

Real-time water rendering - projected grid concept, 2004

Hydrax

Rendering Water as a Post-process Effect

 

posted on 2010-10-07 01:03  泥巴.Zhang  阅读(1722)  评论(2编辑  收藏  举报