Lua代码
-- 创建一个sprite添加到场景里
local dstSprite = cc.Sprite:create("dst.png")
dstSprite:setPosition(cc.p(100, 100))
self:addChild(dstSprite)
-- 创建一个texture当做蒙版
local mask = cc.Director:getInstance():getTextureCache():addImage("mask.png")
-- 创建glProgram
local glProgram = cc.GLProgram:createWithFilenames(ls.Update:getRealPath("shader/mb.vsh"), ls.Update:getRealPath("shader/mb.fsh"))
-- 获取glProgramState
local glProgramState = cc.GLProgramState:getOrCreateWithGLProgram(glProgram)
-- 设置蒙版
glProgramState:setUniformTexture("u_mask_texture", mask)
dstSprite:setGLProgram(glProgram)
dstSprite:setGLProgramState(glProgramState)
-- 设置混合模式
dstSprite:setBlendFunc({src=gl.SRC_ALPHA, dst=gl.ONE_MINUS_SRC_ALPHA})
mb.vsh
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif
void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}
mb.fsh
#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.a;
}