【问题标题】:How to add a shader to a fixed-pipeline OpenGL app如何将着色器添加到固定管道 OpenGL 应用程序
【发布时间】: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、G​​L_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_ARGB per-se。您可以使用GL_BGRA,然后在进行像素传输(例如glTexImage2D (...))时使用GL_..._REV 数据类型来反转组件的顺序。从长远来看,仅了解这一点可能会为您节省很多痛苦,因为这是您处理 ARGB 和 ABGR 像素格式的有效方式。它们不是原生的,但您可以让 GL 在像素传输(输入/输出)期间翻转组件顺序,并使它们完全不存在问题。

标签: macos opengl fragment-shader


【解决方案1】:

我不想问这个,但是你现在的问题到底是什么?将着色器附加到固定功能管道并不难;您所需要的只是重新实现顶点和片段着色器正在取代的那一点点功能。您可以使用诸如 gl_ModelViewMatrix 之类的内置 GLSL 变量来使用由旧版 OpenGL 代码设置的值;你可以在这里找到其中一些:http://www.hamed3d.org/Res/GLSL_Reference/0321552628_AppI.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多