我有一个 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() 函数,并在我的场景中创建项目后调用它,但这也不起作用。
问问题
1550 次
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 回答