Я пытаюсь использовать 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();
}
Как мне обновить мои шейдеры?