1

我有一个 QGraphicsScene,我在其中添加了一个 QGraphicsItem。在 QGraphicsItem 中,我渲染了 OpenGL ES 2.0 的 hello triangle 示例中使用的三角形。问题是,如果我在函数以外的任何地方创建和编译着色器QGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget),它们就不会被编译。我知道您应该激活 GL 渲染上下文,但是当我将视口设置为 GLWidget 时不会发生这种情况吗?我尝试了各种方法,例如在 QGraphicsItem 构造函数或 QGraphicsScene 中编译它们并将 QGraphicsItem 设置为父级(我了解到它们是非常愚蠢的事情),但(显然)没有任何效果。对我来说最合乎逻辑的是在 QGraphicsItem 类中创建一个 initShaders() 函数,并在我的场景中创建项目后调用它,但这也不起作用。

4

1 回答 1

3

创建 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();
    }
}
于 2011-06-16T08:26:55.507 回答