工作需要实现遮罩效果,之前quick-cocos2dx 2.0的实现版本(纯象素在cpu中的 *** 作所以效率低),升级到quick cocos2dx 3.3版本后,shader功能有有强,所以利用shader实现遮罩效果。
quick coco2dx 2.2.6实现方法:
function BasicMovIE:buildMasked(__mask,__pic) local __mb = ccBlendFunc() __mb.src = GL_ONE __mb.dst = GL_ZERO local __pb = ccBlendFunc() __pb.src = GL_DST_Alpha __pb.dst = GL_ZERO local __maskSprite = display.newSprite(__mask):align(display.left_BottOM,0) __maskSprite:setBlendFunc(__mb) local __picSprite = display.newSprite(__pic):align(display.left_BottOM,0) __picSprite:setBlendFunc(__pb) local __maskSize = __maskSprite:getContentSize() local __canva = CCRenderTexture:create(__maskSize.wIDth,__maskSize.height) __canva:begin() __maskSprite:visit() __picSprite:visit() __canva:endTolua() -- self:setScaleX(-1) self:setDirc(self.dirc,false) self:setFlipY(true) self:setTexture(__canva:getSprite():getTexture()) end
该方法是官方提供的方法,是通过调用node的visit进行绘图的,自然效率低。
网上资料实现方法:
#ifdef GL_ESprecision mediump float;#endifvarying vec4 v_fragmentcolor;varying vec2 v_texCoord;uniform sampler2D u_mask_texture;voID main() {vec4 mask_Fragcolor = texture2D(u_mask_texture,v_texCoord); gl_Fragcolor = v_fragmentcolor*texture2D(CC_Texture0,v_texCoord); gl_Fragcolor.a = mask_Fragcolor.r;}
直接拿来用是有问题,并没有处理透明部分,自已改进方法如下:
#ifdef GL_ESprecision mediump float;#endifvarying vec4 v_fragmentcolor;varying vec2 v_texCoord;uniform sampler2D u_mask_texture;voID main() { vec4 mask_Fragcolor = texture2D(u_mask_texture,v_texCoord); if (mask_Fragcolor.a <= 0) { mask_Fragcolor.a=0; gl_Fragcolor = mask_Fragcolor; return; } gl_Fragcolor = v_fragmentcolor*texture2D(CC_Texture0,v_texCoord);}
总结 以上是内存溢出为你收集整理的cocos2dx-lua实现遮罩效果全部内容,希望文章能够帮你解决cocos2dx-lua实现遮罩效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)