我有一个QQuickPaintedItem
(https://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着色器时做错了什么。第二种情况:请告诉我正确的做法。