先上個自己實現(xiàn)的水面模擬圖:

效果比較簡單,只是模擬了下水面的反射效果。折射與Fresnel系數(shù)沒有考慮。
水面模擬大致需要分這么幾步:
1.剪裁掉水面以下的頂點(diǎn)[gpu里的clipplane要注意轉(zhuǎn)換到Clip Space],
將攝像機(jī)放到同原攝像機(jī)關(guān)于水面對稱的位置,比如原來攝像機(jī)在(x,y,z),
此時就該把攝像機(jī)放在(x,-y,z),up向量也要設(shè)置成向下的。
再把場景渲染到Render Target的紋理上(我用的紋理大小是256*256),不知道為什么Render Target的紋理大小不能超過窗口大小,超過的話渲染會出錯,知道的大大告訴我一下哈。
于是,就得到了這樣一個紋理:

2.將上面得到的紋理與水面的頂點(diǎn)對應(yīng).
把Vertex Shader中乘過變換矩陣后的坐標(biāo)傳到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;
既可以讓水面頂點(diǎn)與紋理對應(yīng),然后再想辦法把紋理坐標(biāo)擾亂來模擬水面波動。
3.再渲染一次場景就可以了。
大家也可以參考下Azure的水面渲染源代碼:
http://www.azure.com.cn/article.asp?id=186