想要从相机预览(实时)更改像素颜色,是否可以使用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";
有没有办法只处理单个像素并使用着色器更改颜色。
我想将黄色像素更改为绿色像素。
答案 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);
这只是动态写的东西,你需要稍微玩一下。