Поддержка OpenGL Shader для QQuickPaintedItem - PullRequest
0 голосов
/ 07 марта 2019

У меня есть 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. Второй случай: пожалуйста, просветите меня, как сделать это правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...