lin*_*llo 6 c++ opengl qt framebuffer off-screen
是否可以QGLWidget使用Qt 完全在屏幕外渲染,而无需将场景重新绘制到屏幕上,从而避免完全缓冲区在显示器上翻转?
我需要保存在帧缓冲区上生成的每一帧,但是,由于序列是由4000帧组成的,屏幕上的时间间隔是15ms我花费的,4000*15ms=60s但我需要比60秒快得多(计算不是瓶颈,这里只是更新问题).
可以更快地在帧缓冲区上渲染屏幕吗?我可以在QGLWidget中避免显示器刷新率吗?
如何在没有慢速paintGL()调用的情况下完全渲染帧缓冲区?
现在我假设我们正在谈论Qt4.
是否可以在QGLWidget中完全在屏幕外渲染
离屏渲染根本不是依赖于窗口系统的任务.在大多数工具包中,WGL(至少)和GLX的唯一问题是你不能拥有无表面的上下文,即没有绑定到窗口系统提供的drawable的上下文.换句话说,只要当前上下文存在,您将始终拥有窗口系统提供的默认帧缓冲区,该帧缓冲区是不可变的.
有办法创建一个不需要X11手动窗口的上下文,但通常不值得麻烦.例如,对于EGL和OpenGL ES,这个问题不存在,因为有一个扩展趋向于完全解决这个问题,即屏幕外渲染.
但是,您可以在设置有效上下文后隐藏QGLWidget,并使用framebuffer对象执行所有操作,而无需默认帧缓冲.
我可以在QGLWidget中避免显示器刷新率吗?
不,据我所知,Qt4的OpenGL模块无法以编程方式转换vsync.你可以转向SDL或GLFW这样的东西(不确定FreeGLUT).
但是,您可以随时在驱动程序设置中关闭内容.这也会影响QGLWidget(或更好的放置,底层窗口系统的交换行为.)
可以更快地在帧缓冲区上渲染屏幕吗?
最终真的应该没关系.你想要的图像数据不是VRAM,所以在将当前帧渲染到FBO后,无论如何都需要获取图像.如果需要双缓冲和交换,您可以将结果blit到前缓冲区(或后缓冲区),或者在进一步处理当前帧之前需要回读内容.
但是,与任何OpenGL和性能相关,不要猜 - 配置文件!
如果没有缓慢的paintGL()调用,如何在framebuffer上完全渲染?
一旦情境设置,你不需要插件在所有.你可以在没有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;
}
Run Code Online (Sandbox Code Playgroud)
在我当前的机器上程序打印:
ATI技术公司
AMD Radeon HD 7900系列
1.4(2.1(4.2.12337兼容性配置文件上下文13.101))
请注意QGLWidget从未实际显示的内容,也不会发生事件处理.Qt OpenGL库仅用于上下文创建.没有Qt干预就完成了其他任务.只是不要忘记根据您的需要设置视口和东西.
请注意:如果您只需要一些方便的方法来设置上下文,您可能需要切换到一些比Qt4更轻量级的工具包,如FreeGLUT.就个人而言,我发现FreeGLUT在设置一个有效的上下文时更加可靠,就像我想要它在某些硬件上一样,例如Sandy Bridge CPU.