最近做水的渲染,几经波折,今天终于做出来了,下面给大家看几张截图:
限制了折射距离,纯白色表示折射可视度为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