我试图在iOS下第一次使用OpenGL,试图通过将YUV图像转换为RGB来渲染它们。我环顾四周,在这里和那里找到了一些例子,我打算使用Apple的GLCameraRipple示例代码中提供的顶点/片段着色器。我理解执行转换所需的数学运算。我无法理解OpenGL API以及如何在屏幕上简单地绘制2D纹理。
有人能说明使用OpenGL绘制纹理所需的高级步骤吗?如果我理解在概念上需要做什么,我希望我能够弄清楚细节。
据我所知,到目前为止,顶点着色器在片段着色器和顶点着色器对顶点进行操作之前触发,片段着色器对其间的所有内容进行操作。变化关键字用于将顶点之间插入的数据发送到片段着色器。
这会产生一些问题:
感谢您的时间。
答案 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可以使用此数据绘制多边形。函数glGenBuffers
,glBindBuffer
和glBufferData
可用于将此信息传递给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
函数绘制多边形并在顶部渲染纹理。