gpt4 book ai didi

ios - 使用 GLKit openGL 绘制 YUV 图像 - iOS

转载 作者:行者123 更新时间:2023-12-01 18:18:49 27 4
gpt4 key购买 nike

我想在 iOS 设备上渲染 yuv 图像。我认为它可以使用openGL来实现。 (其实我得连续渲染多个这样的图像)

我的理解是 GLKit 是 iOS 创建的一个抽象,其中有一个 GLKView它将拥有并处理渲染缓冲区。我目前正在尝试使用 GLKViewController并且帧更新正在以所需的 fps 成功完成。我通过使用 glClear 来遵守这一点函数调用。

现在的任务是在 View 上渲染图像。

有类GLKBaseEffect这将有基本的着色器。我不知道要设置什么属性,所以我只是创建它并调用 prepareToDraw在每次渲染之前。

有一个处理纹理的类,GLKTextureLoader ,但在我看来,它只适用于 Quartz 图像,即 yuv420 平面无法使用此类加载到纹理中。

// create the texture
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, [imageNSData bytes]);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

我使用此代码生成纹理并绑定(bind)它,但我真的不知道我在这里要做什么。不管它是什么,它都不会在屏幕上显示任何图像,我不知道下一步该做什么。

我没有创建任何着色器,假设 baseEffect 会有一些东西。

还有这个 https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW8告诉我我必须使用 EAGLayer 在屏幕上渲染图像。

我可以使用 GLKit 来渲染图像吗?如果是,我们是否有任何不使用 GLKTextureLoader 的示例代码或教程?类(我找不到任何)?如果否,是否有使用 EAGLLayer 进行渲染的类似教程? (直到现在我还没有探索过)?

最佳答案

听起来您真的在这里询问了几个不同的主题:

  • 如何使用 GLKView 绘制对比 CAEAGLLayer
  • 如何GLKBaseEffectGLKTextureLoader一般适合OpenGL ES绘图
  • 拥有纹理后如何绘制纹理
  • YUV图像数据如何渲染

  • 我将尝试依次解决每个问题...
    GLKView对于您想要做的任何 OpenGL ES 绘图都很好——它为您完成了您链接到的旧文档所做的所有事情(设置帧缓冲区、 CAEAGLLayer s 等​​),因此您不必编写该代码。里面 GLKView绘图方法( drawRect:glkView:drawInRect: ,取决于您是在子类还是委托(delegate)中绘图),您编写与 CAEAGLLayer 相同的 OpenGL ES 绘图代码(或任何其他系统)。

    您可以使用 GLKView , GLKTextureLoader , 和 GLKBaseEffect彼此独立。如果您想编写所有自己的绘图代码并使用自己的着色器,可以在 GLKView 中进行绘图。不使用 GLKBaseEffect . (你甚至可以混合和匹配 GLKBaseEffect 和你自己的东西,就像你在使用 OpenGL 游戏模板创建一个新的 Xcode 项目时看到的那样。)同样, GLKTextureLoader加载图像数据并吐出 name您需要将其绑定(bind)以进行绘图,无论您是否使用 GLKBaseEffect 进行绘图,都可以使用它。 .

    一旦获得纹理,无论是通过 GLKTextureLoader或自己读取/解码数据并将其提供给 glTexImage2D ,使用它进行绘图有三个基本步骤:
  • 将纹理名称与 glBindTexture 绑定(bind).
  • 绘制一些要纹理化的几何体(使用 glDrawArraysglDrawElements 或类似的)
  • 有一个片段着色器来查找纹素并输出颜色。

  • 如果您只想绘制填充 View 的图像,只需绘制一个四边形(两个三角形)。当我想全屏绘制时,这是我用来设置一个四边形的顶点数组对象的代码:
    typedef struct __attribute__((packed)) {
    GLKVector3 position;
    GLKVector2 texcoord;
    } Vertex;

    static Vertex vertexData[] = {
    {{-1.0f, 1.0f, -1.0f}, {0.0f, 0.0f}},
    {{-1.0f, -1.0f, -1.0f}, {0.0f, 1.0f}},
    {{ 1.0f, 1.0f, -1.0f}, {1.0f, 0.0f}},
    {{ 1.0f, -1.0f, -1.0f}, {1.0f, 1.0f}},
    };

    glGenVertexArraysOES(1, &_vertexArray);
    glBindVertexArrayOES(_vertexArray);

    glGenBuffers(1, &_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)offsetof(Vertex, position));
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)offsetof(Vertex, texcoord));
    glBindVertexArrayOES(0);

    然后,绘制它:
    glBindVertexArrayOES(_vertexArray);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    这只是几何绘图部分。将此与 GLKBaseEffect 结合使用-- 谁的 transform属性是默认的恒等变换,其 texture2d0属性设置为 name通过 GLKTextureLoader 加载的纹理或其他方式——你会得到一个充满视野的广告牌,上面有你的纹理。

    最后,YUV 部分......我将主要针对它。你从哪里得到你的 YUV 纹理数据?如果它来自设备摄像头,您应该查看 CVOpenGLESTexture/ CVOpenGLESTextureCache ,如 this answer 所涵盖.无论如何,您应该能够使用 APPLE_rgb_422 处理 YUV 纹理。扩展名,如 this answer 所涵盖.您也可以查看 this answer获取一些帮助编写片段着色器以动态处理 YUV 到 RGB。

    关于ios - 使用 GLKit openGL 绘制 YUV 图像 - iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875109/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com