【问题标题】:How to draw to front buffer with QOpenGLWidget如何使用 QOpenGLWidget 绘制到前端缓冲区
【发布时间】:2016-03-31 00:33:21
【问题描述】:

我正在将我的应用程序从使用 Qt 5.3.2 的 QGLWidget 升级到使用 QT 5.6.0 的 QOpenGLWidget。该应用程序已升级并运行良好。但是,我一直试图保留我的调试工具。我的开发环境是 Visual Studio 2013,尽管最终应用程序使用双缓冲图形,但出于调试目的,我编写了一些方法,可以从调试器交互调用,绘制到前端缓冲区并在屏幕上查看输出。这些函数不再起作用,因为 QOpenGLWidget 绘制到帧缓冲区。此外,即使在我调用 glDrawBuffer(GL_FRONT) 时尝试绘制之前,它也会生成 glError 到 1280(无效枚举)。额外的数据——glGetIntegerv(GL_DRAW_BUFFER, &my_val) 返回 0x8ce0,即 GL_COLOR_ATTACHMENT0,即使我的意图是将 GL 功能限制为仅 2.0,它也适用于 GL 3.0。

【问题讨论】:

  • QOpenGLWidget 绘制到中间 FBO,因此它需要 OpenGL 3 / OpenGL 2 + FBO / OpenGL ES 2,并且不提供对 GL_FRONT 绘制缓冲区的访问。如果您真的需要它,请改用QOpenGLWindow + createWindowContainer
  • 感谢您的建议。听起来这需要相当多的工作。
  • @peppe 的建议(大部分)效果很好。尽管我不确定如何克服,但仍然存在键盘焦点问题。 stackoverflow.com/questions/37196155/…

标签: opengl qt5


【解决方案1】:

解决方案的功劳归于@peppe。事实证明,他的建议并不太难实施,让我实现了我想要的。从 QOpenGLWidget 切换到 QOpenGLWindows 及其 QWidget 容器的组合使我能够完全实现我想要的。

我从 QOpenGLWindow 派生了我的类,并让它记住了一个指向通过 QWidget::createWindowContainer(my_class_pointer) 获得的 QWidget 的指针;然后,每当我使用 QOpenGLWidget 中不存在的 QGLWidget 方法时,我都会将这些调用重定向到容器。

QOpenGLWindow 似乎对我的调试工具直接绘制到前端缓冲区非常满意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多