思路:
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)