尝试将原始 OpenGL 渲染到 QtQuick 应用程序中,似乎 QQuickWindow::setClearBeforeRendering 不起作用?

Trying to render raw OpenGL into a QtQuick application, seems that QQuickWindow::setClearBeforeRendering is not working?

我正在使用 Qt 5.4、QtQuick 2.4。

基本上,我希望能够将原始 OpenGL 渲染到用 QtQuick/QML 编写的应用程序中,并且我希望在使用 QQmlApplicationEngine.

时这样做

我完成的主要教程是(看似)非常标准的教程,发现 here

但是,本教程使用 QQuickView 而不是 QQmlApplicationEngine 来加载 QML UI。如果我将代码更改为使用 QQmlApplicationEngine,GL 渲染将不再有效,我真的不明白为什么。

this GitHub 存储库中的代码承诺使用 QQmlApplicationEngine 将原始 OpenGL 绘制到 QtQuick 应用程序中,甚至设法实现这一承诺,但它通过挂钩 QQuickWindow::afterRendering(参见 squircle.cpp 的第 79 行)。如果此 signal/slot 连接更改为连接到 QQuickQindow::beforeRendering,场景的 GL 部分将再次显示为未渲染。这是 IMO 最简单的示例,它重现了我遇到的问题(除了一些样板文件)。

QQuickWindow::clearBeforeRendering 似乎(正确)设置为 false(同一文件的第 86 行)。

我是不是漏掉了什么?

在 Qt 5.4 中 Window.contentItem property was introduced and painting of ApplicationWindow content area was changed. I used a custom item derived from QQuickFramebufferObject to fix it. You can find example on GitHub.

在我的示例中,当未定义 FBO__ 宏时,将使用 QtQuick Scenegraph OpenGL-under-Qml 示例中的代码。 setClearBeforeRendering(false) 不再工作了。我相信 ApplicationWindow 会在 GUI 渲染发生时擦除整个 window 背景。我有一个想法以某种方式(通过 flags 属性 和事件处理程序)拦截擦除背景事件,但仍然没有执行它。基于 QQuickFramebufferObject 的自定义项目工作正常,但我认为与 QQuickQindow::beforeRendering().

中的绘画相比它有内存开销

我在升级到 Qt 5.4 时遇到了同样的问题。我找到的解决方法是更改​​主要 QML ApplicationWindow 项目的背景颜色。

Main.qml...

ApplicationWindow
{
  id: mainWindow
  width: 800
  height: 600
  color: "black"

将 "white" 以外的任何颜色置于 属性 颜色中对我有用。出于某种原因,当尝试使用 beforeRendering() 信号在 QQuickItem 中使用 OpenGL 进行绘制时,使背景变白会覆盖 setClearBeforeRendering(false)。

使用什么颜色并不重要,因为无论如何您都必须在自定义 OpenGL 代码中使用 glClear 清除背景,并且这将是绘图完成后看到的颜色。

就是不要用白色!

我假设这是一个错误,直到有人告诉我否则。