QGLWidget 和快速离屏渲染

2024-04-03

是否可以在屏幕外完全渲染QGLWidget使用 Qt 无需将场景重新绘制到屏幕,从而完全避免缓冲区在监视器上翻转?

我需要保存帧缓冲区上生成的每一帧,但是,由于序列由 4000 帧组成,并且屏幕上的时间间隔为15ms我花费4000*15ms=60s但我需要比 60 秒快得多(这里计算不是瓶颈,只是更新问题)。

在帧缓冲区上进行离屏渲染可以更快吗?我可以避免 QGLWidget 中的显示器刷新率吗?

如何在不降低速度的情况下完全在帧缓冲区上渲染paintGL() calls?


现在我假设我们正在谈论 Qt4。

是否可以在 QGLWidget 中完全离屏渲染

离屏渲染根本不是一个真正依赖于窗口系统的任务。大多数工具包中 WGL(至少)和 GLX 的唯一问题是您无法拥有无表面的背景,即未绑定到窗口系统提供的可绘制对象的上下文。换句话说,您将始终提供窗口系统默认帧缓冲区只要当前上下文存在,就不可变。

有一些方法可以创建不需要的上下文window手动使用 X11 但通常不值得这么麻烦。例如,对于 EGL 和 OpenGL ES,这个问题不存在,因为有一个扩展专门针对这个问题,即离屏渲染。

但是,您可以在设置有效上下文后简单地隐藏 QGLWidget,并使用帧缓冲区对象来完成所有操作,而无需默认帧缓冲区干预。

我可以避免 QGLWidget 中的显示器刷新率吗?

不,据我所知,Qt4 的 OpenGL 模块无法以编程方式关闭垂直同步。您可以向 SDL 或 GLFW 寻求类似的帮助(不确定 FreeGLUT)。

但是,您始终可以在驱动程序设置中关闭某些功能。这也会影响 QGLWidget (或者更好地说,底层窗口系统的交换行为。)

在帧缓冲区上进行离屏渲染可以更快吗?

最后真的应该不重要。您需要将图像数据存放在 VRAM 之外的其他位置,因此在将当前帧渲染到 FBO 后,无论如何您都需要获取图像。您要么将结果传输到前缓冲区(如果需要双缓冲和交换,则将结果传输到后缓冲区),或者需要在进一步处理当前帧之前读回内容。

然而,与任何 OpenGL 和性能相关的事情一样,不要猜测 - 简介!

如何在帧缓冲区上完全渲染而不需要缓慢的 PaintGL() 调用?

一旦设置了上下文,您就不需要该小部件at all。您可以自己完成所有的魔法,无需 Qt 的干预。唯一的原因paintGL()存在的目的是为用户提供一个易于使用的界面,保证在需要更新小部件时调用该界面。

EDIT:关于评论中的查询,请参阅这个最小的代码示例,它应该可以跨平台工作而无需更改。

#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 科技公司

AMD Radeon HD 7900 系列

1.4(2.1(4.2.12337 兼容性配置文件上下文 13.101))

请注意如何QGLWidget实际上从未变得可见,并且不会发生任何事件处理。 Qt OpenGL 库仅用于上下文创建。其他任何事情都可以在没有 Qt 干预的情况下完成。只是不要忘记根据您的需要设置视口和其他内容。

请注意:如果您需要的只是一些方便的方法来设置上下文,您可能需要切换到一些比 Qt4 更轻量的工具包,例如 FreeGLUT。就我个人而言,我发现 FreeGLUT 在设置有效上下文方面要可靠得多,这与我在某些硬件上想要的方式完全一致,例如桑迪桥 CPU。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QGLWidget 和快速离屏渲染 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐