- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是否可以使用 Qt 在 QGLWidget
中完全脱离屏幕进行渲染,而无需将场景重新绘制到屏幕,从而避免缓冲区在监视器上完全翻转?
我需要保存在帧缓冲区上生成的每一帧,但是,由于序列由 4000 帧组成并且屏幕上的时间间隔为 15ms
我花费了 4000*15ms=60s
但我需要比 60s 快得多(计算不是这里的瓶颈,只是更新问题)。
在帧缓冲区上进行离屏渲染可以更快吗?我可以避免 QGLWidget 中的显示器刷新率吗?
如何在没有缓慢的 paintGL()
调用的情况下完全在帧缓冲区上渲染?
最佳答案
现在我假设我们正在谈论 Qt4。
Is it possible to render totally offscreen in a QGLWidget
离屏渲染根本不是一个依赖于窗口系统的任务。在大多数工具包中,WGL(至少)和 GLX 的唯一问题是您不能拥有无表面上下文,即未绑定(bind)到窗口系统提供的可绘制对象的上下文。换句话说,您将始终拥有窗口系统提供的默认帧缓冲区,只要当前上下文存在,它就是不可变的。
有一些方法可以用 X11 手动创建不需要窗口的上下文,但通常不值得这么麻烦。例如,对于 EGL 和 OpenGL ES,这个问题不存在,因为有一个扩展恰好解决了这个问题,即离屏渲染。
但是,您可以在设置有效上下文后简单地隐藏 QGLWidget,并使用帧缓冲区对象执行所有操作,而无需默认帧缓冲区干预。
Can I avoid the monitor refresh rate in my QGLWidget?
不,据我所知,Qt4 的 OpenGL 模块无法以编程方式关闭 vsync。您可以求助于 SDL 或 GLFW 以获得类似的东西(不确定 FreeGLUT)。
但是,您始终可以在驱动程序设置中关闭这些内容。这也会影响 QGLWidget(或者更确切地说,底层窗口系统的交换行为。)
Can rendering offscreen on a framebuffer be faster?
最后真的不应该重要。您需要在 VRAM 以外的其他地方获取图像数据,因此在将当前帧渲染到 FBO 之后,无论如何您都需要获取图像。您要么将结果 blit 到前台缓冲区(如果您需要双缓冲和交换,则为后台缓冲区),或者您需要在进一步处理当前帧之前回读内容。
但是,对于任何与 OpenGL 和性能相关的事物,不要猜测 - 分析!
How do I render completely on framebuffer without the slow paintGL() calls?
设置上下文后,您根本不需要小部件。您可以在没有 Qt 干预的情况下自己完成所有魔术。 paintGL()
存在的唯一原因是为用户提供一个易于使用的界面,保证在需要更新小部件时调用该界面。
编辑:关于您在评论中的查询,请参阅这个最小的代码示例,它应该无需更改即可跨平台工作。
#include <iostream>
#include <QtOpenGL/QGLWidget>
#include <QtGui/QApplication>
void renderOffScreen ()
{
std::cout << glGetString(GL_VENDOR) << std::endl;
std::cout << glGetString(GL_RENDERER) << std::endl;
std::cout << glGetString(GL_VERSION) << std::endl;
// do whatever you want here, e.g. setup a FBO,
// render stuff, read the results back until you're done
// pseudocode:
//
// setupFBO();
//
// while(!done)
// {
// renderFrame();
// readBackPixels();
// processImage();
// }
}
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QGLWidget gl;
// after construction, you should have a valid context
// however, it is NOT made current unless show() or
// similar functions are called
if(!gl.isValid ())
{
std::cout << "ERROR: No GL context!" << std::endl;
return -1;
}
// do some off-screen rendering, the widget has never been made visible
gl.makeCurrent (); // ABSOLUTELY CRUCIAL!
renderOffScreen ();
return 0;
}
在我当前的机器上,程序打印:
ATI Technologies Inc.
AMD Radeon HD 7900 Series
1.4 (2.1 (4.2.12337 Compatibility Profile Context 13.101))
请注意 QGLWidget
从未真正可见并且没有发生任何事件处理。 Qt OpenGL 库仅用于上下文创建。无需 Qt 干预即可完成任何其他操作。只是不要忘记根据您的需要设置视口(viewport)和其他东西。
请注意:如果您只需要一些方便的方法来设置上下文,您可能希望切换到一些比 Qt4 更轻量级的工具包,例如 FreeGLUT。就我个人而言,我发现 FreeGLUT 在某些硬件上完全按照我想要的方式设置有效上下文时更加可靠,例如Sandy Bridge CPU。
关于c++ - QGLWidget 和快速离屏渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934102/
我正在使用带有 PySide 绑定(bind)的 python 中的 Qt。我的应用程序的主要部分是可以调整到特定值的 OpenGL View (这是一个模拟器,用于在移动设备的不同分辨率下测试我的游
我是QT新手,有问题。我从http://qt.nokia.com/downloads/sdk-windows-cpp下载了用于开源C++开发的Qt SDK,并在PATH中添加了C:\QT\2010.0
我想在 QGLWidget 中显示 OptixSDK 的示例 6。 我的应用程序只有 3 个 QSlider 用于绕 X、Y、Z 轴和 QGLWidget 旋转。 据我了解,每当我的 QSlider
我正在 Qt 中制作一个 GUIon,我正在使用 QGLWidgt 来显示对象的运动。为了调试目的,我在矩阵上进行了硬编码以尝试显示茶壶,但屏幕上没有显示任何内容。我尝试了很多东西,我只是不知道出了什
基本上我想在 Text Edit 小部件上显示按下的按钮。 Key 事件适用于 GLWidget。如何与 GLWidget 中的 MainWindow 小部件进行交互?到目前为止,这是我的代码, 主窗
我基本上想做的是创建一个 QGLWidget 的实例(或者更确切地说是 QGLWidget 的派生类),将它添加到 QMainWindow ,然后从我的 QTCreator 程序中的任何地方访问 QG
我有一个 Qt 应用程序,它在 Mac OS 上使用 OpenGL 绘图和 QGLWidget。在我的 MBP 上运行良好,但在 30"屏幕上尝试时,我注意到存在窗口大小限制。 如果我将窗口大小增加到
我想编写一个单线程应用程序来显示两个 QGLWidget(一个用于 3D,一个用于 2D)。我试图找到有关同时显示的两个 QGLWidgets 的信息,但没有找到任何对我有帮助的信息。 现在,我认为我
我看了很多关于 OpenGL 不绘图、常见错误等的文章和 SO 问题。这个让我很困惑。 我已经为 glOrtho 尝试了几种不同的设置、不同的顶点位置、颜色等,但都无济于事。 我可以确认 OpenGL
我有小部件: class Main_Widget : public QWidget { Q_OBJECT public: explicit Main_Widget(QWidget *p
是否可以使用 Qt 在 QGLWidget 中完全脱离屏幕进行渲染,而无需将场景重新绘制到屏幕,从而避免缓冲区在监视器上完全翻转? 我需要保存在帧缓冲区上生成的每一帧,但是,由于序列由 4000 帧组
我是 OpenGL 和 Qt 的新手,我正在同时学习这两者(已经 3 天了:)。几年前,我用 DirectX 做了一些实验,我清楚地记得在那里制作全屏窗口是可能的。我所说的全屏是指真正的全屏,即使顶部
我正在上传大量纹理(每秒 60 个 VGA 图像)并且它阻塞了我的 UI 线程。来自 the Qt 5.1 QGLWidget manual page (强调我的): Texture uploadin
我正在使用 QGraphicsView显示 2D 图像并有一个单独的 QGLWidget窗口以显示一些 3D 对象。我正在根据 3D 对象的旋转动态更改“QGraphicsView”中显示的图像。 我
我有两个计时器来重新绘制 QGLWidget 并确定 FPS QObject::connect(&fpsTimer, SIGNAL(timeout()), this, SLOT(updateFps()
我有一种流媒体应用程序,它应该捕获窗口的内容。在窗口中,一个 QGLWidget 绘制了东西。目前我在每个绘制周期中都使用 widget.grabFrameBuffer(必须是实时的)。该应用使用 1
我有一个 QGLWidget,我在其中渲染一个动态网格。我想做的是录制我在此窗口中查看的视频。如果可能的话,我想使用 Qt 的低级多媒体库或高级 Phonon。 非常感谢您的想法! 最佳答案 在最新版
我想知道是否有比这更好的解决方案:我有一个渲染代码和一个颜色选择代码,我已经共享了这两个代码(VBO 等)之间可以共享的所有内容,我的代码看起来像: void paintGL() { label1:
我想使用 QGLWidget、QGraphicsScene 和 QGraphicsView 创建一个简单的缩略图查看器。我在将 QGLWidget 放在 QGraphicsScene 上时遇到问题。代
我一直在尝试在 QGLWidget 中渲染立方体,但结果是错误的。无论我如何旋转它,它看起来都像一个扁平的正方形。就像它没有注意到它顶点的 Z 坐标一样。就在我添加 GL_DEPTH_BUFFER_B
我是一名优秀的程序员,十分优秀!