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

时间:2013-03-05 06:39:15

标签: ios opengl-es glsl textures shader

我试图在iOS下第一次使用OpenGL,试图通过将YUV图像转换为RGB来渲染它们。我环顾四周,在这里和那里找到了一些例子,我打算使用Apple的GLCameraRipple示例代码中提供的顶点/片段着色器。我理解执行转换所需的数学运算。我无法理解OpenGL API以及如何在屏幕上简单地绘制2D纹理。

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

据我所知,到目前为止,顶点着色器在片段着色器和顶点着色器对顶点进行操作之前触发,片段着色器对其间的所有内容进行操作。变化关键字用于将顶点之间插入的数据发送到片段着色器。

这会产生一些问题:

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

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

我建议任何基本的OpenGL教程http://www.cs.washington.edu/education/courses/cse557/00wi/projects/impressionist/help.html 例如。另请查看Kronos小组的opengl.org网站。

在OpenGL中将图像绘制到屏幕上的标准方法是绘制两个纹理三角形(一个矩形),并将图像编码为纹理。顶点着色器往往非常标准化,并且变化不大(99%的情况下)。您的图像处理(如波纹或颜色空间转换)都将位于像素着色器中。

答案 1 :(得分:0)

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

  

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

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

此页面很好地解释了它:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial

  

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

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

  

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

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

  

如何访问最终结果?

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

  

如何在将适当的数据传递到着色器后触发操作?

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