如何在OpenglES中更改像素颜色

时间:2015-11-27 06:31:49

标签: android opengl-es

想要从相机预览(实时)更改像素颜色,是否可以使用OpenGL ES FRAGMENT_SHADER?

目前我有处理相机预览的代码, B / W预览的一个片段。

"#extension GL_OES_EGL_image_external : require\n" +
                "precision mediump float;\n" +
                "varying vec2 vTextureCoord;\n" +
                "uniform samplerExternalOES sTexture;\n" +
                "void main() {\n" +
                "    vec4 tc = texture2D(sTexture, vTextureCoord);\n" +
                "    float color = tc.r * 0.3 + tc.g * 0.59 + tc.b * 0.11;\n" +
                "    gl_FragColor = vec4(color, color, color, 1.0);\n" +
                "}\n";

有没有办法只处理单个像素并使用着色器更改颜色。

我想将黄色像素更改为绿色像素。

1 个答案:

答案 0 :(得分:0)

您应该更加具体地了解您的算法,但您所说的将是:

vec4 tc = texture2D(sTexture, vTextureCoord);
if(tc.r > .9 && tc.g > .9 && tc.b < .1) { // very yellow color
    gl_FragColor = vec4(.0, 1.0, .0, 1.0);
}
else {
    gl_FragColor = tc;
}

你可能想要一些更聪明的算法。能够平衡更黄色和更绿色的像素的东西。这需要一点想象力和大量的不同样本,图像来观看结果。例如,您可能会尝试计算一个指示像素黄色的因子,然后使用此因子将原始像素颜色与绿色混合:

     vec4 tc = texture2D(sTexture, vTextureCoord);
     highp float yellowScale = ((sTexture.r + sTexture.g)*.5) * // intensity factor
                               (1.0-sTexture.b) * // discard blue factor
                               (1.0 - abs(sTexture.r - sTexture.g)); // pure yellow factor
     gl_FragColor = mix(tc, vec4(.0, 1.0, .0, 1.0), yellowScale);

这只是动态写的东西,你需要稍微玩一下。