У меня есть QQuickPaintedItem
(https://doc.qt.io/qt-5/qquickpainteditem.html) производный элемент, который берет свое содержимое из файла QML, и на более позднем этапе я пытаюсь нарисовать его, используя функции OpenGL, вызывая QPainter::beginNativePainting();
( 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. Второй случай: пожалуйста, просветите меня, как сделать это правильно.