swift / OpenGL ES 2.0 - 从YUV420缓冲区创建纹理

时间:2017-11-02 10:02:09

标签: ios swift opengl-es opengl-es-2.0

我在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);

如何实现此解码?

ALTERNATIVE:

我已经描述了我在Android上解码YUV缓冲区的方式。也许有另一种方法来创建基于yuvpixels的纹理而不像这样解码它。我已经使用FragmentShader(Link)尝试了以下方法,但它对我不起作用。我得到黑屏或绿屏,但图像永远不会呈现。还有一些方法使用两个单独的缓冲区用于Y和UV - 但在此我不知道如何将我的YUV缓冲区分成Y和UV。

你是否有任何新的yuv渲染示例/样本,这些示例/样本没有过时且有效?

1 个答案:

答案 0 :(得分:0)

如果您只需要显示该图像/视频,那么您根本不需要将其转换为rgb纹理。您可以将所有3个平面(Y / Cb / Cr)绑定为单独的纹理,并在片段着色器中执行yuv-> rgb转换,只需要三个点的产品。