【发布时间】:2013-10-22 01:45:55
【问题描述】:
我正在更新基于较旧的固定管道 OpenGL 的 Mac OS 现有应用程序。 (我猜是 OpenGL 2。)它使用 NSOpenGLView 和正射投影来创建动画万花筒,带有静止图像或来自连接的摄像机的输入。
它是在高清摄像机可用之前编写的(或者至少很容易实现)。它的编写是为了期待来自 Quicktime (k422YpCbCr8CodecType) 的 YCBCR_422 视频帧,并将这些帧作为 GL_YCBCR_422_APPLE 传递给 OpenGL,以将它们映射到纹理。
我的公司决定是时候更新应用程序以支持新的高清摄像头了,但我不知道如何继续。
我有相当多的 OpenGL 经验,但我的知识参差不齐并且存在差距。
我正在使用委托方法 captureOutput:didOutputVideoFrame:withSampleBuffer:fromConnection 通过 QTCaptureDecompressedVideoOutput 从相机接收帧
我有一个 Logitech c615 用于测试,我得到的缓冲区报告为 32 位 RGBA (GL_RGBA8) 格式。我相信它实际上是 ARGB 格式。
但是,根据 glTexImage2D 上的文档,唯一支持的输入像素格式是 GL_COLOR_INDEX、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_RGB、GL_BGR GL_RGBA、GL_BGRA、GL_LUMINANCE 或 GL_LUMINANCE_ALPHA。
我想添加一个片段着色器,当我将纹理映射到输出网格时,它会将纹理数据转换为 RGBA 格式。
自从编写这个应用程序以来,我通过为 OpenGL ES 2 编写 iOS 应用程序学习了着色器的基础知识,它根本不支持固定管道 OpenGL。
如果我能提供帮助,我真的不想将应用程序重写为完全基于着色器。我想实现一个可选的片段着色器,可以在需要时将我的像素数据用于视频源,但继续使用固定管道来管理我的投影矩阵和模型视图矩阵。
如何将着色器添加到(否则固定的)渲染管道?
【问题讨论】:
-
在做了一些挖掘之后,我发现像素的实际内存存储在我从CVPixelFormatDescriptionCreateWithPixelFormatType得到的像素格式字典的kCVPixelFormatOpenGLFormat键中,数据在GL_BGRA中,它支持glTexImage2D。因此,在这种情况下,我不需要求助于 swizzling。不过,我仍然对如何将着色器添加到我的固定管道 OpenGL 代码感兴趣。
-
另外,您不需要
GL_ARGBper-se。您可以使用GL_BGRA,然后在进行像素传输(例如glTexImage2D (...))时使用GL_..._REV数据类型来反转组件的顺序。从长远来看,仅了解这一点可能会为您节省很多痛苦,因为这是您处理 ARGB 和 ABGR 像素格式的有效方式。它们不是原生的,但您可以让 GL 在像素传输(输入/输出)期间翻转组件顺序,并使它们完全不存在问题。
标签: macos opengl fragment-shader