1. 程式人生 > >quick-cocos2dx實現彈窗背景虛化

quick-cocos2dx實現彈窗背景虛化

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