----更新:2014-9-25 荧光泡泡: ----更新:2014-9-24 实现了多spotlight: ----更新:2014-9-20 由于项目对效率的要求,以场景渲染两遍的代价来实现这种带曝光的spotlight效果无法接受了,所以想了个优化的办法,使不必渲染两遍也能带有一定程度的曝光,见日志:http://user.qzone.qq.com/350479720/blog/1411200107 -----原帖 与遮罩类似,不过与单纯遮罩相比多了曝光。 要点是重载场景的visit函数将递归访问劫持,改作渲染到纹理(renderTexture不加入场景树)。然后用渲染出的纹理生成sprite(sprite不加入到场景树),并手动调用sprite的visit。这样就实现了场景只渲染到纹理而sprite只渲染到屏幕。 接下来对sprite的draw函数进行重载,在其中将shader更换为后处理shader,就ok了。 效果如图 聚光灯可以随鼠标移动,聚光灯半径和曝光强度可以调节 2d探照灯有两种:简单和复杂。简单的就是渲染出一个mask叠到屏幕上,这种是没有任何光感的;复杂的照亮的部分可以带曝光,有光感。 但是带曝光的2d探照灯效果需要用后处理的方式实现,即将场景渲染到纹理上然后再传入shader进行处理,效率实在是不太行。 是否可以如既带曝光又无需后处理呢?想了一个变通的方法:就是先渲染场景,然后再在混合模式(GL_DST_COLOR,GL_SRC_COLOR)下渲染明度值。这样就可以产生最多2倍的曝光。虽然这样不如后处理的方法可以产生任意倍的曝光,但一般情况下最多2倍的曝光也基本够用了。而且,如果我们在此结果上重复使用此法,其实也可以产生更高倍数的曝光,但是仍然会影响性能。 |
|
来自: 勤奋不止 > 《游戏引擎cocos2d》