借鉴了多位博主的代码,谢谢!~~分享精神!
使用版本:cocos2d-x2.2.1
在实际项目中,经常需要用到灰色图像。比如按钮变灰,一般情况下,我们需要准备三张图,一张正常颜色图,一张按钮按下图,一张按钮变灰图。若此种类似情况过多,就会导致资源包过大,这显然不是我们愿意看到的结果。此种情况下,我们就可以考虑修改程序的方法,实现正常颜色图变灰,就可以减少资源图。
基于上述情况,我们需要增加程序中图像变灰代码。具体有两种思路:
(一)因为图像在cocos2dx引擎中是使用CCImage加载进来的,图像数据也使用CCImage存储。因此,可以使用图像处理方法将图像数据修改,转换为灰度图,然后创建精灵;
(二)使用shader的方式,将图像显示转化为灰度图显示。
1、本文采用的就是第二种方式。具体步骤如下:写好一个图像变灰的shader程序,并放入到cocos2dx引擎下面的shader文件夹中。
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中添加
extern CC_DLL const GLchar*ccpositionTextureGray_frag; |
3、ccShaders.cpp中添加
GLchar*ccpositionTextureGray_frag= #include"ccShader_positionTextureGray_frag.h" |
4、CCshadercache.cpp中添加枚举类型
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()中添加
//positionTextureGrayshader p= new CCGLProgram(); loadDefaultShader(p,kCCShaderType_positionTextureGray); m_pPrograms->setobject(p,kCCShader_positionTextureGray); p->release(); |
CCshadercache::reloadDefaultShaders()中添加
p=programForKey(kCCShader_positionTextureGray); p->reset(); |
评论列表(0条)