Создание шейдерной программы для QGraphicsItem - PullRequest
1 голос
/ 15 июня 2011

У меня есть QGraphicsScene, в который я добавляю QGraphicsItem. Внутри QGraphicsItem я отрисовываю треугольник, использованный в примере привет треугольника OpenGL ES 2.0. Проблема в том, что если я создаю и компилирую шейдеры в любом месте, кроме функции QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget), они не компилируются. Я знаю, что у вас должен быть активен контекст рендеринга GL, но разве этого не происходит, когда я устанавливаю свой видовой экран в GLWidget? Я пробовал разные вещи, такие как компиляция их в конструкторе QGraphicsItem или в QGraphicsScene и установка QGraphicsItem в качестве родителя (что я узнал, что это очень глупые вещи), но (очевидно) ничего не работает. Мне показалось наиболее логичным создать функцию initShaders () внутри класса QGraphicsItem и вызывать ее после создания элемента в моей сцене, но это также не сработало.

1 Ответ

2 голосов
/ 16 июня 2011

Создайте производный класс QGraphicsView. Переопределите setupViewport (QWidget * viewport) для инициализации шейдеров. Это позволит вам убедиться, что контекст актуален при компиляции шейдеров. Однако требуется, чтобы элементы были добавлены в сцену до вызова setViewport () в графическом представлении.

void MyGraphicsView::setupViewport(QWidget *viewport)
{
    QGLWidget *glWidget = qobject_cast<QGLWidget*>(viewport);
    if (glWidget) {
        glWidget->makeCurrent();
        foreach (QGraphicsItem *item, scene()->items())
        {
            MyGraphicsShaderItem *glItem = qgraphicsitem_cast<MyGraphicsShaderItem*>(item);
            if (glItem)
                glItem->initShader();
        }
        glWidget->doneCurrent();
    }
}
...