1.平均值法
R = G = B = (R + G + B) / 3
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// 定义贴图坐标
vec2 uv = fragCoord / iResolution.xy;
// 采样贴图
vec3 color = texture(iChannel0, uv).rgb;
// 输出颜色
float c = (color.r + color.g + color.b) / 3.0;
fragColor = vec4(vec3(c), 1.0);
}
效果:
2.最大值法
R = G = B = max(R,G,B)
float c = max(color.r , max(color.g , color.b));
效果:
3.加权平均法
公式如下:
R=G=B=WR * R + WG * G + WB * B;
人眼对于三原色的敏感度从高到低是绿,红,蓝。所以权值应该是WG>WR>WB
由YUV颜色空间,可得
R=G=B = 0.299* R + 0.587 * G + 0.114 * B
灰度矩阵:
代码:
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// 定义贴图坐标
vec2 uv = fragCoord / iResolution.xy;
// 采样贴图
vec3 color = texture(iChannel0, uv).rgb;
// 输出颜色
float c = color.r * 0.299 + color.g * 0.587 + color.b * 0.114;
fragColor = vec4(vec3(c), 1.0);
}
矩阵形式
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
// 定义贴图坐标
vec2 uv = fragCoord / iResolution.xy;
// 采样贴图
vec3 color = texture(iChannel0, uv).rgb;
mat3 m = mat3(0.299,0.299,0.299,
0.587,0.587,0.587,
0.114,0.114,0.114);
// 输出颜色
color = m * color;
fragColor = vec4(color, 1.0);
}
效果: