OpenGL着色器对QQuickPaintedItem

时间:2019-03-07 13:48:02

标签: c++ qt opengl glsl shader

我有一个QQuickPaintedItemhttps://doc.qt.io/qt-5/qquickpainteditem.html)派生的项目,它从QML文件中获取内容,在稍后的阶段,我尝试通过调用QPainter::beginNativePainting();使用OpenGL函数来使用它(https://doc.qt.io/qt-5/qpainter.html#beginNativePainting) 。

一切顺利,直到我尝试将着色器添加到代码中(paint方法中的一些简化示例代码)

sharedContext = QOpenGLContext::currentContext();

m_glcontext = new QOpenGLContext();
m_glcontext->setShareContext(sharedContext);
m_glcontext->setFormat(sharedContext->format());

if (!m_glcontext->create()) 
{
    qWarning("Unable to create shared context!");
}

m_surface = new QOffscreenSurface();
m_surface->setFormat(m_glcontext->format());
m_surface->create();
if (!m_surface->isValid()) 
{
    qWarning("Invalid surface");
}

if(!QOpenGLShaderProgram::hasOpenGLShaderPrograms(m_glcontext))
{
    qWarning() << "the context has no support for shader programs";
}

m_shader = new QOpenGLShaderProgram;
m_shader->addShaderFromSourceCode(QOpenGLShader::Vertex, "..." );
if (!m_shader->link()) 
{
    qWarning() << "Unable to link shader:" << m_shader->log();
}

首先,我得到警告“上下文不支持着色器程序”,其次,着色器不链接,并且着色器的log()的内容为空。

但是,如果我编译并运行Qt自己的着色器示例(例如:Examples / opengl / hellogl2),它不会抱怨不支持着色器,但是我发现它们的代码实际上包含一个QOpenGLWidget派生类,而不是QQuickPaintedItem

问题:有人可以确认QQuickPaintedItem项目无法访问OpenGL的着色器,还是在尝试初始化我的opengl着色器时做错了什么。第二种情况:请告诉我正确的做法。

0 个答案:

没有答案