cocos2d-x 单色精灵
发布时间:2020-12-14 21:14:27 所属栏目:百科 来源:网络整理
导读:说说我自己想出的获取一个精灵对应的单色精灵的方法(将一个精灵中不透明部分的颜色全部变成单一颜色,单色精灵这个名字我自己随便取的) 方法一 RenderTexture Sprite *getMonoColorSprite(Sprite *sprite){auto size = sprite-getContentSize();auto ancho
说说我自己想出的获取一个精灵对应的单色精灵的方法(将一个精灵中不透明部分的颜色全部变成单一颜色,单色精灵这个名字我自己随便取的) 方法一 RenderTexture Sprite *getMonoColorSprite(Sprite *sprite) { auto size = sprite->getContentSize(); auto anchorPoint = sprite->getAnchorPoint(); auto position = sprite->getPosition(); auto center = Vec2(size.width / 2,size.height / 2); //如果直接用sprite,renderTexture上下是反的 //有时sprite的锚点和位置变了,renderTexture里的纹理是空的 //所以创建一个临时的上下翻转的精灵 auto temp = Sprite::createWithTexture(sprite->getTexture(),sprite->getTextureRect()); temp->setPosition(center); temp->setFlippedY(true); auto mask = LayerColor::create(Color4B::WHITE,size.width,size.height); mask->setBlendFunc({ GL_DST_ALPHA,GL_ZERO }); auto renderTexture = RenderTexture::create(size.width,size.height); renderTexture->setAnchorPoint(Vec2::ZERO); renderTexture->setPosition(Vec2::ZERO); renderTexture->begin(); temp->visit(); mask->visit(); renderTexture->end(); //用renderTexture里的纹理创建要返回的精灵 auto tex = renderTexture->getSprite()->getTexture(); auto spr = Sprite::createWithTexture(tex); //恢复到与sprite相同的锚点和位置 spr->setAnchorPoint(anchorPoint); spr->setPosition(position); return spr; }上面的函数返回了一个白色的精灵,然后用setColor可以设置颜色,测试代码如下 auto sprite = Sprite::create("grossini.png"); sprite->setPosition(100,200); auto mono = getMonoColorSprite(sprite); mono->setColor(Color3B::GREEN); mono->setPosition(300,200); addChild(sprite); addChild(mono); 有点像数字图像处理中的图像二值化,不过这里这有一种颜色 使用RenderTexture效率低下,而且要占用额外空间,图片多的话,可能会多占很多空间,这种方法不太实用,推荐使用下面的Shader实现
方法二 Shader
fsh文件如下 #ifdef GL_ES precision lowp float; #endif varying vec4 v_fragmentColor; varying vec2 v_texCoord; void main() { vec4 texColor = texture2D(CC_Texture0,v_texCoord); <span style="white-space:pre"> </span>//最终颜色完全由顶点颜色决定 gl_FragColor=v_fragmentColor; gl_FragColor.a*=texColor.a; } 使用方法 //可以在游戏初始化加载Shader,并添加到<span style="font-family: Arial,Helvetica,sans-serif;">ShaderCache中,方便以后调用</span> auto fragmentSource = FileUtils::getInstance()->getStringFromFile("monocolor.fsh"); auto shader_program = GLProgram::createWithByteArrays(ccPositionTextureColor_noMVP_vert,fragmentSource.c_str()); ShaderCache::getInstance()->addGLProgram(shader_program,"monocolor"); //应用使用Shader sprite->setGLProgram(ShaderCache::getInstance()->getGLProgram("monocolor")); 用Shader实现的代码少而且效率高,推荐使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |