0

有没有一种方法,可能是 ccBlendFunc,可以让我在不影响纯白色(255、255、255)、纯黑色(0、0、0)和纯透明(alpha=255)像素的情况下动态着色精灵?

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

4

1 回答 1

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 中,并从那里检索它。

于 2013-11-09T08:39:39.430 回答