cocos2d-x 2.x 版本使用的灰化方法:Cocos2d-x 精灵变灰效果
"#ifdef GL_ES \n \
precision mediump float; \n \
#endif \n \
uniform sampler2D u_texture; \n \
varying vec2 v_texCoord; \n \
varying vec4 v_fragmentColor; \n \
void main(void) \n \
{ \n \
// Convert to greyscale using NTSC weightings \n \
vec4 col = texture2D(u_texture, v_texCoord); float grey = dot(col.rgb, vec3(0.299, 0.587, 0.114)); gl_FragColor = vec4(grey, grey, grey, col.a); \n \
}";
cocos2d-x 3.0 版本使用的灰化方法:
sdk目录下的文件:\tests\cpp-tests\Resources\Shaders\example_greyScale.fsh
#ifdef GL_ES
precision mediump float;
#endif
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform sampler2D CC_Texture0;
void main(void)
{
vec4 c = texture2D(CC_Texture0, v_texCoord);
gl_FragColor.xyz = vec3(0.2126*c.r + 0.7152*c.g + 0.0722*c.b);
gl_FragColor.w = c.w;
}
转自:PSCS3专家讲堂77灰度与位图颜色模式
我们可以观察一下RGB颜色通道,可以发现它们都是灰度图像,那么彩色图像转为灰度,到底应该由哪个通道来决定呢?这是一个问题哈。
也许有的人会说,我可以随意取一个通道嘛。其实这样做,得到的结果往往不是最佳的。而PS在进行彩色到灰度处理的时候,在旧的版本中,往往是用默认算法一步到位,没有灵活性可言。
声明,以下内容较深,初学者可以看看,不一定现在就要理解:
对于彩色转灰度,有一个很著名的心理学公式:
灰度值 = R(红色值)*0.299 + G(绿色值)*0.587 + B(蓝色值)*0.114
在关文涛先生的《选择的艺术》一书中,把这个公式简单归纳为
30%红色值+59%绿色值+11%蓝色值
不过似乎PS还有更多的模拟算法在里边,得到的值并不是完全一致的。
我们不必去算颜色的具体值,只要知道,用默认的转灰度形式,得到的是不灵活的转换就可以了。
我们可以利用CS3新增加的黑白调整来做这个工作。先把图像转为黑白图像(注意:模式还是RGB,但是图像是由黑白灰来表达,如要转为灰度模式,还要用到菜单进行转换),这样的话,我们就可以把图像调为自己想要的模样,再转为灰度啦。
这个黑白调整选项真是个好东西,它把我们以前用通道计算得到结果的复杂方式,转化为一步到位。PS的功能是越来越强大了。
初学者请在具有一定基础之后,再回来看下面的内容:
以下数据引自“灰鹿”先生原创,供学有所长的朋友探讨,此公式尚无完全定论,还存在微小差异。
关于彩色转为灰度图像,由于上述的公式得到的误差很大,所以有不少朋友进行了研究。最终得到比较接近的公式。
公式原理,RGB图像转为Lab模式图,并将a和b通道填充128中间灰,(对Lab通道如不了解,可以看一下这个教程:点击观看81集:颜色模式-Lab)得到的结果可以发现,和彩色转为黑白得到的结果基本一致。经过灰鹿先生的计算得到下列公式:
公式:
Gray = (R^2.2 * 0.213 + G^2.2 * 0.715 + B^2.2 * 0.072)^(1/2.2)
K = (1-Gray/255)*100
下面是此公式抽样验证的结果,计算值(K)应四舍五入取值。验证时一定要设为sRGB模式/Gray Gamma 2.2,关闭“使用仿色”和“使用黑场补偿”。
单击下面的链接,观看本节教程:
点击观看77集:颜色模式-灰度与位图