不断更新OpenGL窗口

Posted

技术标签:

【中文标题】不断更新OpenGL窗口【英文标题】:update Opengl window continuously 【发布时间】:2016-08-09 12:21:57 【问题描述】:

我正在使用 Qt、OpenGL 和 GLEW 在四边形上映射纹理并进行渲染。我想改变每一帧的纹理并不断更新窗口。如何强制它不断更新?

如 cmets 中所述,通过添加计时器并将其连接到插槽以发出信号更新功能来解决问题。

【问题讨论】:

“不断更新窗口”是什么意思? 我想加载纹理并显示它,然后加载第二个纹理并显示它,依此类推。现在每次鼠标移动时它都会更新窗口。我也在使用 qt 和 OpenGL。 然后你应该看看你的主循环,如果它等待一个事件或者它是否轮询一个事件。我认为 qt 默认情况下会等待一个事件,因此会阻塞你的循环。但我不确定。 你如何用你的实际代码更新你的窗口? 请edit您的问题显示what you have tried so far。您应该包含您遇到问题的代码的minimal reproducible example,然后我们可以尝试帮助解决具体问题。您还应该阅读How to Ask。 【参考方案1】:

如果您的意思是交换缓冲区,您需要在每帧调用特定于平台的交换函数(wglSwapBuffers、glXSwapBuffers 等)并确保禁用 vsync。如果您的意思是让窗口调整大小,这不是一个开放的 gl 特定问题,这也取决于窗口系统。

【讨论】:

【参考方案2】:

如果您使用 qt 创建窗口并管理鼠标移动等事件,则可能会导致应用程序在重新绘制窗口之前等待事件发生。我认为您可以使用 QTimer 对象并将其超时信号连接到您的更新函数。

否则,如果您使用某些waitEvent() 函数处理事件,请将其更改为非阻塞版本。

【讨论】:

frameSwapped 上的信号可能会更好。 frameSwapped 只是来自QQuickWindow 的信号,我们不知道他是否在使用它。 我使用的是QGLWidget,在paintGL末尾添加just update也会强制渲染继续,但这是一个好的解决方案吗? 据我所知,如果你有QGLWidget,这是使用它的方式,但我从未使用 qt 和 OpenGL

以上是关于不断更新OpenGL窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何连续更新过剩窗口?

更新窗口显示 OpenGL/GLUT C++

# OpenGL常用函数详解(持续更新)

OpenGL - 告诉顶点着色器 VBO 已经改变

在OpenGL中撕裂?

如何频繁更新顶点缓冲区数据(每帧)opengl [重复]