我在 UInt8 数组中有一个 YUV420 像素缓冲区。我需要用它创建一个纹理以便用 OpenGL 渲染它。在 Android 中,有一种简单的方法可以将我的数组解码为纹理的 RGB 数组。代码如下:
BitmapFactory.Options bO = new BitmapFactory.Options();
bO.inJustDecodeBounds = false;
bO.inPreferredConfig = Bitmap.Config.RGB_565;
try {
myBitmap= BitmapFactory.decodeByteArray( yuvbuffer,
0,
yuvbuffer.length,
bO);
} catch (Throwable e) {
// ...
}
我需要在我的 ios 平台(Xcode 8.3.3、Swift 3.1)上解码 yuv 缓冲区,以便将其作为数据放入以下方法中:
void glTexImage2D( GLenum target,
GLint level,
GLint internalFormat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid * data);
如何实现这种解码?
替代方案:
我已经描述了在 Android 上解码 YUV 缓冲区的方式。也许还有其他方法可以基于 yuvpixels 创建纹理,而无需像这样解码它。我已经使用 FragmentShader ( Link ) 尝试了以下方法,但它对我不起作用。我遇到黑屏或绿屏,但图像从未渲染。还有一些方法使用两个单独的缓冲区用于 Y 和 UV - 但对此我不知道如何将我的 YUV 缓冲区拆分为 Y 和 UV。
您是否有任何未过时且有效的 yuv 渲染新示例/示例?
最佳答案
如果您只需要显示该图像/视频,那么您实际上不需要将其转换为 RGB 纹理。您可以将所有 3 个平面 (Y/Cb/Cr) 绑定(bind)为单独的纹理,并在片段着色器中执行 yuv->rgb 转换,只需三个点积。
关于ios - swift/OpenGL ES 2.0 - 从 YUV420 缓冲区创建纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47072432/