我正在尝试使用BlackMagic Decklink SDK将来自Decklink卡的视频显示到QtQuick应用程序中。我成功使用QWidgets做到了这一点,所以视频流采集部分正在工作。
使用QWidgets(更具体地说是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();
}
我应该如何更新着色器?
答案 0 :(得分:0)
解决此问题的最简单方法是在屏幕上渲染两个三角形而不是点,从而形成一个正方形。设置这些三角形为纹理,并使用Decklink卡中的数据动态更改纹理缓冲区的内容。
有关在opengl中使用视频帧的更多信息,请参见此线程: How to input video (frames) into a GLSL shader