cocos2dx shader应用——sprite变灰

cocos2dx shader应用——sprite变灰,第1张

概述在实际项目中,经常需要用到灰色图像。比如按钮变灰,一般情况下,我们需要准备三张图,一张正常颜色图,一张按钮按下图,一张按钮变灰图。若此种类似情况过多,就会导致资源包过大,这显然不是我们愿意看到的结果。此种情况下,我们就可以考虑修改程序的方法,实现正常颜色图变灰,就可以减少资源图。 借鉴了多位博主的代码,谢谢!~~分享精神! 使用版本:cocos2d-x2.2.1 在实际项目中,经常需要用到灰色图像 在实际项目中,经常需要用到灰色图像。比如按钮变灰,一般情况下,我们需要准备三张图,一张正常颜色图,一张按钮按下图,一张按钮变灰图。若此种类似情况过多,就会导致资源包过大,这显然不是我们愿意看到的结果。此种情况下,我们就可以考虑修改程序的方法,实现正常颜色图变灰,就可以减少资源图。

借鉴了多位博主的代码,谢谢!~~分享精神!

使用版本:cocos2d-x2.2.1

在实际项目中,经常需要用到灰色图像。比如按钮变灰,一般情况下,我们需要准备三张图,一张正常颜色图,一张按钮按下图,一张按钮变灰图。若此种类似情况过多,就会导致资源包过大,这显然不是我们愿意看到的结果。此种情况下,我们就可以考虑修改程序的方法,实现正常颜色图变灰,就可以减少资源图。

基于上述情况,我们需要增加程序中图像变灰代码。具体有两种思路:

(一)因为图像在cocos2dx引擎中是使用CCImage加载进来的,图像数据也使用CCImage存储。因此,可以使用图像处理方法将图像数据修改,转换为灰度图,然后创建精灵;

(二)使用shader的方式,将图像显示转化为灰度图显示。

1、本文采用的就是第二种方式。具体步骤如下:写好一个图像变灰的shader程序,并放入到cocos2dx引擎下面的shader文件夹中。

@H_502_26@
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //ccShader_positionTextureGray_frag.h "\n\ #ifdefGL_ES\n\ precisionmediump float ;\n\ #endif\n\ \n\ uniformsampler2Du_texture;\n\ varyingvec2v_texCoord;\n\ varyingvec4v_fragmentcolor;\n\ \n\ voID main( )\n\ {\n\ //ConverttogreyscaleusingNTSCweightings\n\ vec4col=texture2D(u_texture,v_texCoord);\n\ grey=dot(col.rgb,vec3(0.299,0.587,0.114));\n\ gl_Fragcolor=vec4(grey,grey,col.a);\n\ }\n\ ";

2、ccShaders.h中添加

1
extern CC_DLL const GLchar*ccpositionTextureGray_frag;

3、ccShaders.cpp中添加

2
GLchar*ccpositionTextureGray_frag= #include"ccShader_positionTextureGray_frag.h"

4、CCshadercache.cpp中添加枚举类型

14
enum { kCCShaderType_positionTexturecolor, kCCShaderType_positionTexturecolorAlphaTest, kCCShaderType_positionTextureGray, //addthis kCCShaderType_positioncolor, kCCShaderType_positionTexture, kCCShaderType_positionTexture_ucolor, kCCShaderType_positionTextureA8color, kCCShaderType_position_ucolor, kCCShaderType_positionLengthTexurecolor, kCCShaderType_ControlSwitch, kCCShaderType_MAX, };

CCshadercache::loadDefaultShaders()中添加

6
//positionTextureGrayshader p= new CCGLProgram(); loadDefaultShader(p,kCCShaderType_positionTextureGray); m_pPrograms->setobject(p,kCCShader_positionTextureGray); p->release();

CCshadercache::reloadDefaultShaders()中添加

4
p=programForKey(kCCShader_positionTextureGray); p->reset();

CCshadercache::loadDefaultShader(CCGLProgram *p,int type)中添加

@H_502_26@
8 case kCCShaderType_positionTextureGray: p->initWithVertexShaderByteArray(ccpositionTexturecolor_vert,ccpositionTextureGray_frag); p->addAttribute(kCCAttributenameposition,kCCVertexAttrib_position); p->addAttribute(kCCAttributenamecolor,kCCVertexAttrib_color); p->addAttribute(kCCAttributenameTexCoord,kCCVertexAttrib_TexCoords); break ;

5、CCGLProgram.h中添加

#definekCCShader_positionTextureGray"ShaderpositionTextureGray"

6、新建一个灰度转换调用类(以便扩展其他的颜色转换)

18 19 20 21
//colorUtils.h #ifndef__color_UTILS_H__ #define__color_UTILS_H__ #include"cocos2d.h" USING_NS_CC; class colorUtils { public : colorUtils(); ~colorUtils(); static AddcolorGray(CCSprite*spr); RemovecolorGray(CCSprite*spr); private : }; #endif

@H_502_26@
20 //colorUtils.cpp #include"colorUtils.h" colorUtils::colorUtils() { } colorUtils::~colorUtils() { } colorUtils::AddcolorGray(CCSprite*spr) { spr->setShaderProgram(CCshadercache::sharedshadercache()->programForKey(kCCShader_positionTextureGray)); } colorUtils::RemovecolorGray(CCSprite*spr) { spr->setShaderProgram(CCshadercache::sharedshadercache()->programForKey(kCCShader_positionTexturecolor)); }

over!~

效果图:

总结

以上是内存溢出为你收集整理的cocos2dx shader应用——sprite变灰全部内容,希望文章能够帮你解决cocos2dx shader应用——sprite变灰所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1056840.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)