cocos2d-x版本:3.2
代码如下:
void XCommon::makeGrey(Node *node, bool grey)
{
if (nullptr == node)
{
return;
}
if (grey)
{
static const char *grayProgramKey = "ShaderPositionTextureGray";
GLProgram *pProgram = GLProgramCache::getInstance()->getGLProgram(grayProgramKey);
if (nullptr == pProgram)
{
const GLchar *vertDefaultSource =
"attribute vec4 a_position; \n" \
"attribute vec2 a_texCoord; \n" \
"attribute vec4 a_color; \n" \
"#ifdef GL_ES \n" \
"varying lowp vec4 v_fragmentColor;\n" \
"varying mediump vec2 v_texCoord;\n" \
"#else \n" \
"varying vec4 v_fragmentColor; \n" \
"varying vec2 v_texCoord; \n" \
"#endif \n" \
"void main() \n" \
"{\n" \
"gl_Position = CC_PMatrix * a_position; \n" \
"v_fragmentColor = a_color;\n" \
"v_texCoord = a_texCoord;\n" \
"}";
const GLchar *pszFragSource =
"#ifdef GL_ES \n" \
"precision mediump float; \n" \
"#endif \n" \
"varying vec4 v_fragmentColor; \n" \
"varying vec2 v_texCoord; \n" \
"void main(void) \n" \
"{ \n" \
"vec4 c = texture2D(CC_Texture0, v_texCoord); \n" \
"gl_FragColor.xyz = vec3(0.4*c.r + 0.4*c.g +0.4*c.b); \n" \
"gl_FragColor.w = c.w; \n" \
"}";
pProgram = GLProgram::createWithByteArrays(vertDefaultSource, pszFragSource);
if (nullptr == pProgram)
{
return;
}
pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);
pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);
pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);
pProgram->updateUniforms();
GLProgramCache::getInstance()->addGLProgram(pProgram, grayProgramKey);
}
node->setGLProgram(pProgram);
}
else
{
node->setGLProgram(GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP));
}
}
表现效果如图: