Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Decklink SDK&;QtQuick_C++_Opengl_Shader_Decklink_Blackmagic - Fatal编程技术网

C++ Decklink SDK&;QtQuick

C++ Decklink SDK&;QtQuick,c++,opengl,shader,decklink,blackmagic,C++,Opengl,Shader,Decklink,Blackmagic,我正在尝试使用BlackMagic Decklink SDK将Decklink卡中的视频显示到QtQuick应用程序中。我使用QWidgets成功地做到了这一点,因此视频流获取部分工作正常 当使用QWidget(更具体地说是QOpenGLWidget)时,我们所要做的基本上就是创建QOpenGLWidget的子类并覆盖initializeGL和paintGL,如下所示: void DeckLinkOpenGLWidget::initializeGL() { 如果(m_DeckLinkScreen

我正在尝试使用BlackMagic Decklink SDK将Decklink卡中的视频显示到QtQuick应用程序中。我使用QWidgets成功地做到了这一点,因此视频流获取部分工作正常

当使用QWidget(更具体地说是QOpenGLWidget)时,我们所要做的基本上就是创建QOpenGLWidget的子类并覆盖initializeGL和paintGL,如下所示:

void DeckLinkOpenGLWidget::initializeGL()
{
如果(m_DeckLinkScreenPreviewWhelper!=nullptr)
{
m_mutex.lock();
m_decklink screen previewwhelper->InitializeGL();
m_mutex.unlock();
}
}
void DeckLinkOpenGLWidget::paintGL()
{
m_mutex.lock();
glLoadIdentity();
glClearColor(0.0f、0.0f、0.0f、0.0f);
glClear(GLU颜色缓冲位);
m_DeckLinkScreenPreviewWhelper->PaintGL();
m_mutex.unlock();
}
在使用QtQuick的自定义渲染器中执行相同操作时,不会发生任何情况。我想我必须编写我的程序&着色器,但我不知道它需要什么。当使用着色器为颜色中的每个像素着色时,会绘制该颜色的正方形,所以我想我还不太清楚(但可能是错的…)

下面是一些代码:

void VideoViewRenderer::initializeGL()
{
QOpenGLFunctions::InitializePenglFunctions();
const char*vertexShaderSource=“#版本330核心\n”
“vec3 aPos中的布局(位置=0);\n”
“void main()\n”
“{\n”
“gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n”
“}\n”;
常量字符*fragmentShaderSource=“#版本330核心\n”
“out vec4 FragColor;\n”
“void main()\n”
“{\n”
FragColor=vec4(0.6f,0.0f,0.0f,1.0f);\n
“}\n”;
m_程序=新QOpenGLShaderProgram();
m_程序->addCacheableShaderFromSourceCode(QOpenGLShader::Vertex,vertexShaderSource);
m_程序->addCacheableShaderFromSourceCode(QOpenGLShader::Fragment,fragmentShaderSource);
m_程序->链接();
m_mutex.lock();
m_decklink screen previewwhelper->InitializeGL();
m_mutex.unlock();
}
void VideoViewRenderer::paintGL()
{
m_程序->绑定();
glLoadIdentity();
glClearColor(0.0f、0.4f、0.0f、0.0f);
glViewport(0,0,m_viewportSize.width(),m_viewportSize.height());
glClear(GLU颜色缓冲位);
m_mutex.lock();
m_DeckLinkScreenPreviewWhelper->PaintGL();
m_mutex.unlock();
m_程序->发布();
}

如何更新着色器?

解决此问题的最简单方法是在屏幕上渲染两个三角形,形成一个正方形,而不是点。将这些三角形设置为纹理,并使用Decklink卡中的数据动态更改纹理缓冲区内容

有关在opengl中使用视频帧的更多信息,请参阅此线程:

是的,这可能会奏效,但我希望最大限度地重用DeckLink SDK,而不是编写自己的着色器,处理不同的视频格式和其他设置(我的视频体验非常有限)。我看了一眼黑魔法着色器,大部分我都不懂。。。我很可能只有几个方法可以调用:/我没有见过BlackMagic着色器,几年前我曾使用Decklink SDK,但那里没有着色器。但是,如果您有这些着色器,可能应该尝试将它们直接加载到渲染对象中。我在你的代码中看到你正在调用“m_decklinkScreenPreviewPer->PaintGL();”你能发布里面的内容吗?不,我没有访问PaintGL代码的权限,只有标题。我所有的都是示例代码,例如:这个示例没有在我的机器上运行,我不知道它是做什么的。但我更愿意走另一条路:找到QOpenGLWidget在做什么,让事情运转起来。