如何使用片段着色器将YUV转换为RGB时要考虑pixelStride

问题描述 投票:0回答:1

此着色器非常适合在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中显示实际颜色

Image with normal camera preview and GLSurfaceView

android opengl-es android-camera2
1个回答
0
投票

不要在着色器中执行YUV转换,这很简单,因为存在几种YUV格式。而是使用GL_TEXTURE_EXTERNAL_OES并从中进行采样,就像使用传统的RGB纹理一样。请参阅SurfaceTexture的Android文档。

© www.soinside.com 2019 - 2024. All rights reserved.