在摸索cocos2d-x时,想要实现精灵变灰的一个效果。使用cocos2d-x自带的一个设置灰色的着色器。
sp:setGLProgram(ShaderCache:getInstance():getGLProgram("ShaderUIGrayScale"))
灰色效果实现了,但是发现该sp的 Opacity 失效了。即使设置Opacity(0)sp也是正常显示的。
最后在片段着色器文件中发现了问题。
ccShader_UI_Gray
gl_FragColor.xyz = vec3(0.2126*c.r + 0.7152*c.g + 0.0722*c.b);
gl_FragColor.w = c.w
发现该片段着色器是直接赋值gl_FragColor(最后渲染到屏幕上的像素信息,一个四维向量(rgba),颜色rgb和透明度alpha)而没有用到顶点着色器传过来的数据 v_fragmentColor。所以设置透明度无效。把该信息传递过去就可以实现透明度设置了。
//修改后
gl_FragColor.xyz = vec3(0.2126*c.r + 0.7152*c.g + 0.0722*c.b);
gl_FragColor.w = c.a * v_fragmentColor.a