参考文章:
http://www.cnblogs.com/slysky/p/3949718.html
http://my.oschina.net/u/1430085/blog/191673
cocos2d-x版本:V3.3 final
主要思路:根据普通图片使用的渲染方式SHADER_NAME_POSITION_TEXTURE_COLOR进行改编,坐标一样,我们只需要修改其颜色控制,即.frag文件即可。
具体如下:
一、新建一个文件ccShader_PositionTextureGray.frag存放于\cocos2d\cocos\renderer
//ccShader_PositionTextureGray.frag
const char* ccPositionTextureGray_frag = STRINGIFY(
\n#ifdef GL_ES\n
precision lowp float;
\n#endif\n
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
vec4 v_orColor=v_fragmentColor*texture2D(CC_Texture0, v_texCoord);
float gray=dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor=vec4(gray, gray, gray, v_orColor.a);
}
);
二、ccShaders.h中添加
extern CC_DLL const GLchar *ccPositionTextureGray_frag;
三、ccShaders.cpp中添加中添加
#include "ccShader_PositionTextureGray.frag"
四、CCGLProgram.h中添加
static constchar* SHADER_NAME_POSITION_TEXTURE_GRAY;
五、CCGLProgram.cpp中添加
const char*GLProgram::SHADER_NAME_POSITION_TEXTURE_GRAY = "ShaderPositionTextureGray";
六、CCGLProgramCache.cpp中添加
1、添加枚举
enum {
………
kShaderType_3DSkinPositionNormalTex,
kCCShaderType_PositionTextureGray,//新增
kShaderType_MAX,
};
2、修改函数loadDefaultGLPrograms()
{
p = newGLProgram();
loadDefaultGLProgram(p,kCCShaderType_PositionTextureGray);
_programs.insert(std::make_pair(GLProgram::SHADER_NAME_POSITION_TEXTURE_GRAY, p));
}
3、修改函数reloadDefaultGLPrograms()
{
………….
//追加
p =getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_GRAY);
p->reset();
loadDefaultGLProgram(p,kCCShaderType_PositionTextureGray);
}
4、修改loadDefaultGLProgram(GLProgram *p,inttype)
{
………………
case kCCShaderType_PositionTextureGray:
p->initWithByteArrays(ccPositionTextureColor_vert,ccPositionTextureGray_frag);
break;
…………………
}
七、使用方法
//设置为灰度
void addSpriteGray(ESprite*sprite)
{
if(sprite)
{
sprite->setGLProgram(cocos2d::GLProgramCache::getInstance()->getGLProgram(cocos2d::GLProgram::SHADER_NAME_POSITION_TEXTURE_GRAY));
}
}
//移除灰度正常显示
void removeSpriteGray(ESprite* sprite)
{
if(sprite)
{
sprite->setGLProgram(cocos2d::GLProgramCache::getInstance()->getGLProgram(cocos2d::GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR));
}
}