水面Alpha混合与边界柔和

    水面原来采用渲染质量较高的菲捏珥水面,这样渲染出来的效果确实不错,不过这需要渲染折射图与反射图,再加上最后一遍场景渲染,整个场景需要渲染三遍,虽然GPU GEM2里面提到了这类水面的优化,经过项目中使用发现开销还是相当的大,外加上原来没有考虑边界柔和,导致水面切边非常锋利,所以决定采用较低的alpha水面混合来代替。

       接下来说说我采用的水面alpha混合方案,需求如下:

1.      水面只需要反射天空

2.      边界柔和,水深的地方反射强度大,也就是越看不清水底

3.      相机距离水面的距离越近,水面就需要越透明(试想相机看着人,而看不见水面下的情况)

根据以上需求,我决定采用在PS中做逐像素渲染。

1.      只反射天空虽然有时候看起来并不真实,但实现足够简单,效率高,这样就不需要反射图了,节省一个RT。简单的实现就是采用一张立方体贴图,然后根据相机与像素向量求个反射向量,再用texCUBE做个采样搞定。

2.      边界柔和看这张图,没有边界柔和的图很丑陋,像一把刀切过一样。这个可以通过做一张水深遮罩图来完成,这张图用基本的灰度图就可以了,平铺整个地形,可以这样生成:取像素任意一点,转换为世界坐标,求出与地形的交点,如果地形在上,则为全透明,填0,如果大于25.5则填1,中间做个线型混合 (byte)(abs(h) × 10)。这样得到的深度图效果如下:

 

如果把这张深度图做为alpha来输出,颜色为白色,我在场景中截了一张图,看,是不是有点样子了,岸边的锋利边缘被柔化了^_^

 

3      相机距离水面的距离越近,水面就需要越透明,这个只须在PS中用distance求出相机与像素的距离,然后通过求出的距离混合alpha就可以了。

看看加上颜色信息后的最终效果,反射了天空,柔化了边缘,效率也提高了,正是我们想要的。

 

 

再来一张:

 

 

 

 

转载请注明出处:

作者:gogoplayer

E-mail : gogoplayer@163.com

QQ : 78939328

http://www.gogoplayer.com.cn

posted on 2008-11-19 15:46  gogoplayer  阅读(2559)  评论(9编辑  收藏  举报

导航