cocos2dx-lua实现遮罩效果

前端之家收集整理的这篇文章主要介绍了cocos2dx-lua实现遮罩效果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

工作需要实现遮罩效果,之前quick-cocos2dx 2.0的实现版本(纯象素在cpu中的操作所以效率低),升级到quick cocos2dx 3.3版本后,shader功能有有强,所以利用shader实现遮罩效果

quick coco2dx 2.2.6实现方法

  1. function BasicMovie:buildMasked(__mask,__pic)
  2. local __mb = ccBlendFunc()
  3. __mb.src = GL_ONE
  4. __mb.dst = GL_ZERO
  5. local __pb = ccBlendFunc()
  6. __pb.src = GL_DST_ALPHA
  7. __pb.dst = GL_ZERO
  8. local __maskSprite = display.newSprite(__mask):align(display.LEFT_BOTTOM,0)
  9. __maskSprite:setBlendFunc(__mb)
  10. local __picSprite = display.newSprite(__pic):align(display.LEFT_BOTTOM,0)
  11. __picSprite:setBlendFunc(__pb)
  12. local __maskSize = __maskSprite:getContentSize()
  13. local __canva = CCRenderTexture:create(__maskSize.width,__maskSize.height)
  14. __canva:begin()
  15. __maskSprite:visit()
  16. __picSprite:visit()
  17. __canva:endToLua()
  18. -- self:setScaleX(-1)
  19. self:setDirc(self.dirc,false)
  20. self:setFlipY(true)
  21. self:setTexture(__canva:getSprite():getTexture())
  22. end


方法是官方提供的方法,是通过调用node的visit进行绘图的,自然效率低。

网上资料实现方法

  1. #ifdef GL_ES
  2. precision mediump float;
  3. #endif
  4.  
  5. varying vec4 v_fragmentColor;
  6. varying vec2 v_texCoord;
  7.  
  8. uniform sampler2D u_mask_texture;
  9.  
  10. void main() {
  11. vec4 mask_FragColor = texture2D(u_mask_texture,v_texCoord);
  12. gl_FragColor = v_fragmentColor*texture2D(CC_Texture0,v_texCoord);
  13. gl_FragColor.a = mask_FragColor.r;
  14. }


直接拿来用是有问题,并没有处理透明部分,自已改进方法如下:

  1. #ifdef GL_ES
  2. precision mediump float;
  3. #endif
  4.  
  5. varying vec4 v_fragmentColor;
  6. varying vec2 v_texCoord;
  7.  
  8. uniform sampler2D u_mask_texture;
  9.  
  10. void main() {
  11. vec4 mask_FragColor = texture2D(u_mask_texture,v_texCoord);
  12. if (mask_FragColor.a <= 0)
  13. {
  14. mask_FragColor.a=0;
  15. gl_FragColor = mask_FragColor;
  16. return;
  17. }
  18. gl_FragColor = v_fragmentColor*texture2D(CC_Texture0,v_texCoord);
  19. }

猜你在找的Cocos2d-x相关文章