使用 OpenGL 将图像渲染到子类 QDeclarativeItem

Posted

技术标签:

【中文标题】使用 OpenGL 将图像渲染到子类 QDeclarativeItem【英文标题】:Render Image into subclassed QDeclarativeItem using OpenGL 【发布时间】:2012-01-21 11:40:28 【问题描述】:

我正在尝试使用 OpenGL ES 2.0 执行多个图像操作,并将输出显示到子类 QDeclarativeItem 中,然后将在我的 QML GUI 中使用它。 我通读了这里找到的答案:http://developer.qt.nokia.com/forums/viewthread/4109 并通过覆盖 QDeclarativeItem 的 paint() 方法成功地在我的 QML GUI 中绘制了一个从红色到蓝色的矩形:

void GLDeclarativeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)

    painter->beginNativePainting();
    glBegin(GL_QUADS);
    glColor3ub(0,0,255);
    glVertex2d(0, 0);
    glVertex2d(0, height());
    glColor3ub(255,0,0);
    glVertex2d(width(), height());
    glVertex2d(width(), 0);
    glEnd();
    painter->endNativePainting();

但是,我想要实现的是绘制将在我的自定义 QGLWidget 中处理的图像作为上述 QDeclarativeItem 的内容(而不是红色到蓝色的内容)。

在我使用的自定义 QGLWidget 中:

void GLWidget::paintGL()

    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

用于绘图,效果很好。但是,我找不到我的 GLWidget 中的绘图和我的 GLDeclarativeItem 之间的转换。到目前为止,我尝试过的所有东西都只是给了我一个没有任何内容的矩形。 感谢您的帮助!

【问题讨论】:

【参考方案1】:

我做了类似的事情,但解决方法不同:我使用了叠加层

我只是将 OpenGL 渲染放在它自己的小部件中,该小部件放置在 QDeclarativeView 的顶部。

这很好用,尽管您不能在 OpenGL 渲染上进行绘制。如果您确实需要,请叠加另一个具有半透明背景的 QML 视图。

祝你好运。

【讨论】:

谢谢赫尔穆特,听起来很有希望。虽然我不确定如何将小部件作为覆盖添加到 QDeclarativeView。你有任何代码可以帮助我吗?可以很抽象,只是给我一个提示。再次感谢。 嗨,想法是这样的:我猜你使用了QDeclarativeView *myview。然后执行QGLWidget * myglwidget = new QGLWidget(myview)(使用您自己的 QGLWidget 子类)并相应地定位它。这样,myglwidgetmyview 的子代,而不是真正的QGraphicsItem。这对你有帮助吗?

以上是关于使用 OpenGL 将图像渲染到子类 QDeclarativeItem的主要内容,如果未能解决你的问题,请参考以下文章

渲染到纹理 OpenGL ES 2.0

openGL FBO 复制到纹理导致黑色/深色图像

OpenGL渲染纹理全白

使用 FBO 和着色器 OpenGL 渲染到纹理

在 Haskell 中使用 OpenGL 渲染 PNG 图像

使用 VAO/VBO 进行 OpenGL 模型/纹理渲染