目前有試過兩種做法
1. RenderTexture + BlendFunc
大概程式碼如下
CCSprite* createMaskSprite()
{
cocos2d::ccBlendFunc bf;
bf.src = GL_DST_ALPHA;//GL_ONE_MINUS_DST_ALPHA;
bf.dst = GL_ZERO;
CCSprite* selfSprite = /*主圖的sprite*/;
CCSprite* maskSprite = /*mask圖的sprite*/;
selfSprite->setPosition(ccp(selfSprite->getContentSize().width/2, selfSprite->getContentSize().height/2));
maskSprite->setPosition(ccp(maskSprite->getContentSize().width/2, maskSprite->getContentSize().height/2));
selfSprite->setBlendFunc(bf);
CCRenderTexture *rt = CCRenderTexture::create((int)selfSprite->getContentSize().width, (int)selfSprite->getContentSize().height);
rt->beginWithClear(0, 0, 0, 0);
maskSprite->visit();
selfSprite->visit();
rt->end();
CCSprite *retval = CCSprite::createWithTexture(rt->getSprite()->getTexture());
retval->getTexture()->setAntiAliasTexParameters();
retval->setFlipY(true);
return retval;
}
主要是使用BlendFunc的方法,在RenderTexture畫出想要的效果之後再使用,但如果只直接用BlendFunc可能會被其他的sprite影響產不出想要的效果
2. Shader
Shader程式碼處理起來比較麻煩,建議看cocos2d-x範例程式的shader部分
下面是我寫的一個小範例
https://github.com/hsienwei/shader_cocos2dx
cocos2d-x的部分主要是參考範例程式改的
重要的是shader部分
#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform sampler2D u_texture;
uniform sampler2D u_mask;
void main() {
vec4 mainColor = texture2D(u_texture, v_texCoord);
vec4 maskColor = texture2D(u_mask, v_texCoord);
vec4 srcColor = vec4(mainColor.r * maskColor.a,
mainColor.g * maskColor.a,
mainColor.b * maskColor.a,
mainColor.a * maskColor.a);
gl_FragColor = srcColor;
}
將主圖的rgba值都乘以mask圖的alpha值即可,要達到這個效果只要動Fragment Shader即可
沒有留言 :
張貼留言