试图将原始OpenGL渲染到QtQuick应用程序中,似乎QQuickWindow :: setClearBeforeRendering无法正常工作?

时间:2015-01-02 22:47:07

标签: qt opengl qt-quick

我正在使用Qt 5.4,QtQuick 2.4。

基本上,我希望能够将原始OpenGL渲染到用QtQuick / QML编写的应用程序中,我希望在使用QQmlApplicationEngine时这样做。

我经历过的主要教程是(貌似)非常标准的教程,here

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

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

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

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

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

... Main.qml

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

在color属性中添加“white”以外的任何内容对我有用。由于某些原因,当尝试使用beforeRendering()信号在QQuickItem中使用OpenGL进行绘制时,使背景白色会覆盖setClearBeforeRendering(false)。

使用什么颜色并不重要,因为你必须在自定义OpenGL代码中使用glClear清除背景,这将是绘图完成时看到的那个。

请勿使用白色!

我认为这是一个错误,直到有人告诉我。

答案 1 :(得分:2)

在Qt 5.4中,引入了Window.contentItem属性,并更改了ApplicationWindow内容区域的绘制。我使用了从QQuickFramebufferObject派生的自定义项来修复它。您可以在GitHub找到示例。

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