如何使用 OpenGL ES 着色器转换 rgbaToYuv 然后渲染到 ImageReader 的表面

问题描述

我想用 openGl 填充 ImageReader。

我的着色器可以转换 rgbaToyuv

这是我的代码

ImageReader.newInstance(vConfig.width,vConfig.height,ImageFormat.YUV_420_888,2,/*1 << 17*/);
eglSurface= eglCreateWindowSurface(xxx,imageReader.getSurface,xxx);
glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,textureOfCameraFrame);
eglSwapBuffers(egldisplay,mEGLSurface);

但我得到以下错误

The producer output buffer format 0x1(RGBA) doesn't match the ImageReader's configured buffer format 0x23(YUV_420_888)

来自 https://cs.android.com/android/platform/superproject/+/master:frameworks/base/media/jni/android_media_ImageReader.cpp;l=590

上面写着imgReaderFmt != bufferFormat

但是我该怎么做才能使其使用 YUV_420_888 格式。

解决方法

如果您希望 GPU 渲染 YUV,则需要使用 EXT_YUV_target 扩展功能来设置 YUV 渲染通道。

https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_YUV_target.txt