分享

cocos2dx 2D聚光灯效果

 勤奋不止 2015-09-11
----更新: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倍的曝光也基本够用了。而且,如果我们在此结果上重复使用此法,其实也可以产生更高倍数的曝光,但是仍然会影响性能。





    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多