opengl Decklink软件开发工具包和QtQuick

3okqufwl  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(176)

我正在尝试使用BlackMagic Decklink SDK将Decklink卡中的视频显示到QtQuick应用程序中。我成功地使用QWidgets完成了同样的操作,因此视频流采集部分可以正常工作。
当使用QWidget(更具体地说是QOpenGLWidget)时,基本上我们所要做的就是创建一个QOpenGLWidget的子类,并覆盖initializeGL和paintGL,如下所示:

void DeckLinkOpenGLWidget::initializeGL()
{
    if (m_deckLinkScreenPreviewHelper != nullptr)
    {
        m_mutex.lock();
        m_deckLinkScreenPreviewHelper->InitializeGL();
        m_mutex.unlock();
    }
}

void DeckLinkOpenGLWidget::paintGL()
{
    m_mutex.lock();
    glLoadIdentity();

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    m_deckLinkScreenPreviewHelper->PaintGL();
    m_mutex.unlock();
}

当用QtQuick在自定义渲染器中做同样的事情时,什么也没有发生。我想我必须写我的程序和着色器,但我不知道它需要什么。当用着色器给每个像素着色时,会画出一个颜色的正方形,所以我想我还没有到(但可能是错的...)。
下面是一些代码:

void VideoViewRenderer::initializeGL()
{
    QOpenGLFunctions::initializeOpenGLFunctions();

    const char* vertexShaderSource = "#version 330 core\n"
                                     "layout (location = 0) in vec3 aPos;\n"
                                     "void main()\n"
                                     "{\n"
                                     "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
                                     "}\n";

    const char* fragmentShaderSource = "#version 330 core\n"
                                       "out vec4 FragColor;\n"
                                       "void main()\n"
                                       "{\n"
                                       "   FragColor = vec4(0.6f, 0.0f, 0.0f, 1.0f);\n"
                                       "}\n";

    m_program = new QOpenGLShaderProgram();
    m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,vertexShaderSource);
    m_program->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
    m_program->link();

    m_mutex.lock();
    m_deckLinkScreenPreviewHelper->InitializeGL();
    m_mutex.unlock();
}

void VideoViewRenderer::paintGL()
{
    m_program->bind();

    glLoadIdentity();
    glClearColor(0.0f, 0.4f, 0.0f, 0.0f);
    glViewport(0, 0, m_viewportSize.width(), m_viewportSize.height());
    glClear(GL_COLOR_BUFFER_BIT);

    m_mutex.lock();
    m_deckLinkScreenPreviewHelper->PaintGL();
    m_mutex.unlock();

    m_program->release();
}

我该如何更新我的着色器?

xzlaal3s

xzlaal3s1#

解决这个问题的最简单的方法是在屏幕上绘制两个三角形而不是点,形成一个正方形。设置这些三角形为纹理,并使用Decklink卡中的数据动态改变纹理缓冲区的内容。
有关在opengl中使用视频帧的更多信息,请参阅此主题:How to input video (frames) into a GLSL shader

相关问题