QVideoFilterRunnable和OpenGL Context如何协同工作?

我正尝试在Android上使用C ++,Qt,QML,OpenCV和OpenGL编程增强现实(AR)应用程序。

工作流程:

  • 相机提供了一个新的视频帧(带有openGL纹理ID)
  • 我捕获这个QVideoFilterRunnable::run(...)
  • 然后我进行一些对象识别并计算出需要将对象放入3D opengl场景中的新位置(在videoframe内)
  • 新渲染openGL对象
  • 将它带入openGL渲染管道(固定功能或兼容性配置文件),并将视频帧作为背景纹理(零拷贝)以最大化渲染速度
  • 操作视频帧纹理的代码示例:

    QVideoFrame FilterRunnable::run(QVideoFrame* input, 
                                    const QVideoSurfaceFormat &sFormat,
                                    RunFlags flags) 
    {
        if(sFormat.handleType() == QAbstractVideoBuffer::GLTextureHandle)
        {
            QOpenGLContext* c = QOpenGLContext::currentContext();
            QOpenGLFunctions* f = c->functions();
    
            GLuint textID = input->handle().toInt();
            f->glBindTexture(GL_TEXTURE_2D,textID);
    
            float pixels[] = {
                0.0f, 0.0f, 0.0f,   1.0f, 1.0f, 0.0f,
                1.0f, 1.0f, 0.0f,   0.0f, 0.0f, 0.0f,
            };
    
            f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    
            f->glTexImage2D(GL_TEXTURE_2D, 
                            0, GL_RGB, 
                            2, 2, 0, 
                            GL_RGB, GL_FLOAT, pixels);
        }
    }
    

    使用glTexImage2D() ,屏幕会变黑而没有任何错误。

    问题是我没有找到任何信息如何FilterRunnable::run()处理背景中的OpenGL上下文。 我不知道如何使用glDrawArrays()glViewport()而不使用标准函数initializeGL()resizeGL()paintGL()

    例如,我想将视频框架(映射在背景多边形上)与其前面的任意OpenGL对象结合在一起。

    我可以在哪里获得关于这个主题的信息或者什么是最好的方法?

    链接地址: http://www.djcxy.com/p/63885.html

    上一篇: How does QVideoFilterRunnable and OpenGL Context works together?

    下一篇: Segfault on glDrawArrays when combining OpenGl and QML