如何动态着色CCSprite但保留黑色,白色和透明像素

时间:2013-11-07 07:13:15

标签: objective-c opengl-es cocos2d-iphone blending

是否有一种方法,可能是ccBlendFunc,它允许我动态着色精灵而不影响纯白色(255,255,255),纯黑色(0,0,0)和纯透明(alpha = 255) )像素?

使用默认的混合功能并在CCSprite上设置sprite.color会将白色像素重新着色为指定ccColor3B值的任何值,这对我来说是不合需要的。

1 个答案:

答案 0 :(得分:1)

使用着色器。如果您使用的是cocos2d 2.1版,请使用ccShader_PositionTextureColor_frag(由CCSprite用于渲染纹理和其他类),复制到此处

#ifdef GL_ES    
    precision lowp float;   
#endif

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform sampler2D CC_Texture0;

void main()
{
    gl_FragColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
}

您想要在main()中更改该行以跳过要跳过的片段。 CCSprite将'sprite.color'属性写入v_fragmentColor(查看代码,有'预乘alpha'变体)。你想在texture2D(CC_Texture0,v_texCoord).a == 0和其他情况下修改v_fragmentColor。

我会扩展CCSprite以使用这个新的着色器(即避免直接使用内置于cocos2d的着色器,有自己的试验和错误位置)。让着色器执行您想要的操作后,在类中添加逻辑以将新着色器程序放在CCShaderCache中,并从那里检索它。