GPU水面模拟

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

你可能感兴趣的:(GPU水面模拟)