先上个自己实现的水面模拟图:
效果比较简单,只是模拟了下水面的反射效果。折射与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