在项目中要对非全屏弹窗做背景模糊处理,当前的方案是:
1. 截图快照。在弹窗弹出之前,执行截图快照,将当前场景的纹理数据获取,并生成显示的第一个精灵,对该精灵进行高斯模糊着色。
2. 二次截图快照。对第一个精灵进行shader处理时,每帧都在进行,消耗太多资源。因此再对当前进行第二次截图快照,生成不需要着色的第二个精灵,显示。移除第一个精灵。
截屏用的接口是cc.RenderTexture:create()
问题来了,用这个接口做截屏时,有偶发的闪退现象出现,
报错在如下图箭头处,实在百思不得其解,版本为3.2
代码:
local winSize = cc.Director:getInstance():getWinSize()
-- 第一次截屏
local renderTexture = cc.RenderTexture:create(winSize.width, winSize.height, cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A8888, gl.DEPTH24_STENCIL8_OES)
renderTexture:begin()
cc.Director:getInstance():getRunningScene():visit()
renderTexture:endToLua()
renderTexture:retain()
local photoTexture = renderTexture:getSprite():getTexture()
local blurSprite = cc.Sprite:createWithTexture(photoTexture)
blurSprite:setPosition(winSize.width/2, winSize.height/2)
--blurSprite:visit()
NodeUtils:nodeBlur(blurSprite)
-- 第二次截屏
local renderTexture1 = cc.RenderTexture:create(winSize.width, winSize.height, cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A8888, gl.DEPTH24_STENCIL8_OES)
renderTexture1:begin()
blurSprite:visit() -- 渲染
renderTexture1:endToLua()
renderTexture1:retain()
local photoTexture1 = renderTexture1:getSprite():getTexture()
local spritePhoto1 = cc.Sprite:createWithTexture(photoTexture1)
spritePhoto1:visit()
self.parent:addChild(spritePhoto1, 0)
spritePhoto1:setName("blur_sprite")
spritePhoto1:setPosition(winSize.width/2, winSize.height/2)
renderTexture:release()
renderTexture1:release()
或者有没有其他更好的方法,求分享,感谢