尝试将原始 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 清除背景,并且这将是绘图完成后看到的颜色。
就是不要用白色!
我假设这是一个错误,直到有人告诉我否则。
我正在使用 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 清除背景,并且这将是绘图完成后看到的颜色。
就是不要用白色!
我假设这是一个错误,直到有人告诉我否则。