工作需要实现遮罩效果,之前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_ES
- precision mediump float;
- #endif
- varying 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_ES
- precision mediump float;
- #endif
- varying 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);
- }