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

标签 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);

如何实现这种解码?

替代方案:

我已经描述了在 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/

相关文章:

java - 适用于 Android 的 OpenGL ES 需要 2.0 命令才能用于 3.0 上下文吗?

ios - View 中CircleView的Circle位置错误

ios - 从今天开始,导航 Controller 扩展为零

ios - 使用 MapKit 和 SwiftUI、Xcode 12 在默认 iOS map 上移动 View 时如何修复终端输出 "Style Z is requested for an invisible rect"

ios - 场景套件: Use multiple SCNView instances side by side

ios - 如何在 OpenGL ES 2.0 中独立操作对象?

ios - 我无法在ios uiwebview中的phoneGap中加载JQuery

ios - 使用多个方案和推送通知配置配置文件

swift - 如何在 Swift 4 中获取实例类并调用类函数?

ios - 如何使 TableView Controller 上的 View 覆盖导航栏?