quick-cocos2dx實現彈窗背景虛化
阿新 • • 發佈:2019-02-17
思路:
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)