Ios 使用OpenGL ES2.0绘制纹理(或如何将GPU用于YUV->;RGB)

Ios 使用OpenGL ES2.0绘制纹理(或如何将GPU用于YUV->;RGB),ios,opengl-es,glsl,textures,shader,Ios,Opengl Es,Glsl,Textures,Shader,我第一次尝试在iOS下使用OpenGL,试图通过将YUV图像转换为RGB来渲染一个YUV图像流。我环顾四周,到处都找到了一些示例,我计划使用Apple的GLCameraRipple示例代码中提供的顶点/片段着色器。我理解执行转换所需的数学知识。我在理解OpenGL API以及如何在屏幕上简单地绘制2D纹理方面遇到了困难 有人能举例说明使用OpenGL绘制纹理所需的高级步骤吗?如果我从概念上理解了需要做什么,我希望我能够弄清楚细节 据我目前所知,顶点着色器在片段着色器和顶点着色器对顶点进行操作之前

我第一次尝试在iOS下使用OpenGL,试图通过将YUV图像转换为RGB来渲染一个YUV图像流。我环顾四周,到处都找到了一些示例,我计划使用Apple的GLCameraRipple示例代码中提供的顶点/片段着色器。我理解执行转换所需的数学知识。我在理解OpenGL API以及如何在屏幕上简单地绘制2D纹理方面遇到了困难

有人能举例说明使用OpenGL绘制纹理所需的高级步骤吗?如果我从概念上理解了需要做什么,我希望我能够弄清楚细节

据我目前所知,顶点着色器在片段着色器和顶点着色器对顶点进行操作之前触发,而片段着色器对两者之间的所有对象进行操作。Variable关键字用于将顶点之间插值的数据发送到片段着色器

这就产生了一些问题:

  • 我是否需要传递一组表示纹理2D帧的顶点
  • 在传递顶点之前,是否需要将YUV数据传递到片段着色器
  • 片段着色器如何使用插值坐标访问适当的YUV样本
  • 如何访问最终结果
  • 将适当的数据传递给着色器后,如何触发该操作

谢谢你抽出时间

我会推荐一些基本的OpenGL教程 例如。也可以查看Kronos group的opengl.org网站


在OpenGL中,在屏幕上绘制图像的标准方法是绘制两个带纹理的三角形(一个矩形),并将图像编码为纹理。顶点着色器趋向于非常标准化,并且没有太多更改(对于99%的情况)。图像处理,如涟漪或颜色空间转换,都将在像素着色器中进行。

我能够绘制纹理。我对UV通道正确显示颜色以及方向/镜像问题有一些问题,但这些问题超出了本问题的范围

我是否需要传递一组表示纹理2D帧的顶点

是的,必须在多边形顶部绘制纹理,二维区域可以表示为两个三角形。顶点缓冲区对象(VBO)可用于将顶点数组以及包含索引的互补数组传递到顶点数组中。OpenGL可以使用这些数据绘制多边形。可以使用函数
glGenBuffers
glBindBuffer
glBufferData
将此信息传递给OpenGL

本页很好地解释了这一点:

在传递顶点之前,是否需要将YUV数据传递到片段着色器

不,可以在加载纹理之前将顶点传递到OpenGL中。但是,在绘制多边形之前,必须将纹理绑定并上载到OpenGL

片段着色器如何使用插值坐标访问适当的YUV样本

在我的实现中,每个顶点都会传递相应的纹理坐标。这将创建顶点位置到纹理坐标的映射。顶点着色器将此坐标输出为
可变
参数。使用
variable
关键字允许片段着色器通过插值接收每个像素的坐标值。片段着色器然后使用该坐标检索相应的纹理样本。在我的例子中,它使用坐标来检索YUV样本

如何访问最终结果

通常,操作的最终结果被推送到帧缓冲区中(我不熟悉细节)。在iOS 5+中,使用GLKView,我在EAGLContext实例上发送
presentRenderbuffer
消息以显示结果

将适当的数据传递给着色器后,如何触发该操作

图形由OpenGL绘图函数之一触发。在顶点/纹理坐标以及纹理数据上传到OpenGL并与着色器中的参数关联后,我使用
glDraweElements
函数绘制多边形并在顶部渲染纹理