水面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
posted on 2008-11-19 15:46 gogoplayer 阅读(2561) 评论(9) 编辑 收藏 举报