此着色器非常适合在API 21上运行的Android设备
其中pixelStride为1且uvRowStride为320(预览分辨率640x480)
#ifdef GL_ES
precision highp float;
#endif
varying vec2 v_texCoord;
uniform sampler2D y_texture;
uniform sampler2D u_texture;
uniform sampler2D v_texture;
void main()
{
float nx,ny,r,g,b,y,u,v;
nx=v_texCoord.x;
ny=v_texCoord.y;
y=texture2D(y_texture,v_texCoord).r;
u=texture2D(u_texture,v_texCoord).r;
v=texture2D(v_texture,v_texCoord).r;
y=1.1643*(y-0.0625);
u=u-0.5;
v=v-0.5;
r=y+1.5958*v;
g=y-0.39173*u-0.81290*v;
b=y+2.017*u;
gl_FragColor = vec4(r,g,b,1.0);
}
但是在具有API 22+的Android设备中始终具有
pixelStride为2且uvRowStride为640(预览分辨率640x480)
参考:https://github.com/wenxiaoming/YUVRender
YUV_420_888 interpretation on Samsung Galaxy S7 (Camera2)
图像的顶部在GLSurfaceView中显示转换后的YUV,底部在正常的TextureView中显示实际颜色
不要在着色器中执行YUV转换,这很简单,因为存在几种YUV格式。而是使用GL_TEXTURE_EXTERNAL_OES
并从中进行采样,就像使用传统的RGB纹理一样。请参阅SurfaceTexture的Android文档。