您的位置:首页 > 移动开发 > Cocos引擎

quick-cocos2dx实现弹窗背景虚化

2015-12-31 15:21 323 查看
思路:

1. 先将背景截图(图1)。

2. 用shader将图1进行模糊处理。

3. 对图1进行截图(图2)。

4. 保留图2,释放掉图1。

原因:shader渲染是每帧进行,图1一直存在的话会耗费GPU资源渲染。故再次截屏生成图2释放掉图1,可以降低开销。

local win_size = size or (cc.Director:getInstance():getWinSize())
--截屏
local render_texture = cc.RenderTexture:create(win_size.width, win_size.height)
render_texture:begin()
app:mainScene():visit()
render_texture:endToLua()
local photo_texture = render_texture:getSprite():getTexture()
local sprite_photo = cc.Sprite:createWithTexture(photo_texture)
:addTo(self)
:pos(display.cx, display.cy)
--强制渲染
sprite_photo:visit()
--模糊处理
local size = sprite_photo:getTexture():getContentSizeInPixels()
local program = cc.GLProgram:createWithFilenames("res/shaders/2d_default.vert","res/shaders/example_Blur.frag")
--此处的shader调用的是cocos2d-x-3.6\tests\cpp-tests\Resources\Shaders下面的example_Blur.fsh。
local gl_program_state = cc.GLProgramState:getOrCreateWithGLProgram(program)
sprite_photo:setGLProgramState(gl_program_state)
--设置模糊参数
sprite_photo:getGLProgramState():setUniformVec2("resolution", cc.p(size.width, size.height))
sprite_photo:getGLProgramState():setUniformFloat("blurRadius",blurRadius or 16)
sprite_photo:getGLProgramState():setUniformFloat("sampleNum",sampleNum or 8)
--再次截屏
local render_texture1 = cc.RenderTexture:create(size.width, size.height)
render_texture1:begin()
sprite_photo:visit()
render_texture1:endToLua()
local photo_texture1 = render_texture1:getSprite():getTexture()
local sprite_photo1 = cc.Sprite:createWithTexture(photo_texture1)
:addTo(self, -1)
:pos(display.cx, display.cy)
--销毁第一次截屏图片
self:removeChild(sprite_photo)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: