【问题标题】:Offscreen rendering with OpenGL version 1.2使用 OpenGL 1.2 版进行离屏渲染
【发布时间】:2015-07-07 02:43:10
【问题描述】:

使用新版本的 OpenGL,我可以使用 FBO 进行屏幕外渲染,并从 FBO 读取像素,然后对数据执行我想要执行的操作。

如何使用不支持 FBO 的旧版本 OpenGL(如 OpenGL 1.2)进行离屏渲染?

【问题讨论】:

  • 扩展?你为什么要使用这么古老的东西呢?
  • 您可能必须使用窗口管理器来执行此操作。因此,除非您真的必须这样做,否则我建议您不要这样做。
  • 除非您还针对古老的 CPU,否则软件渲染器将比尝试在古老的 GPU 上进行渲染更快、更轻松。
  • @user57368 你能更具体地了解一下软件渲染器吗?你的意思是其他渲染库?
  • @ShaoboZi 不,您实际上可以获得软件渲染的 OpenGL 上下文,除非您还使用古老的操作系统,否则您将获得比 1.2 高得多的版本

标签: opengl


【解决方案1】:

OpenGL 中用于离屏渲染的遗留(FBO 之前)机制是 pbuffers。例如对于 Windows,它们在 WGL_ARB_pbuffer extension 中定义。它们也可用于其他平台,如 Mac、Android 等。

除了 pbuffers 的古老性之外,与 FBO 有一个根本的区别:pbuffer 支持是 OpenGL 的窗口系统接口的扩展,而 FBO 支持是 OpenGL 本身的一个特性。

其中一个推论是渲染到 pbuffer 发生在单独的上下文中。对于 FBO,您只需创建一个新的 OpenGL 帧缓冲区对象,并在同一上下文中使用常规 OpenGL 调用对其进行渲染,这在 pbuffer 情况下是不同的。在那里你设置了一个上下文来渲染 屏幕外表面而不是窗口表面。离屏表面是这个上下文的主要帧缓冲区,你在这个单独的上下文中对 pbuffer 进行所有渲染。

话虽如此,请在使用 pbuffers 之前三思而后行。 FBO 支持(至少以扩展形式)已经存在了很长时间。我很难想象编写需要在硬件上运行的新软件,该硬件足够老,不支持 FBO。

FBO 在几乎所有可能的方面都优于 pbuffers。主要优点是无需特定平台的 API 即可使用,并且不需要额外的上下文。

pbuffers 支持但 FBO 不容易支持的唯一情况是您不想创建窗口的纯屏幕外渲染。例如,如果您想在可能没有显示器的服务器上渲染图像,pbuffers 实际上是一种有用的机制。

【讨论】:

  • OpenGL 新手,所以 . glGenFrameBuffers api 从 OpenGL 3.0 开始可用,这使得 FBO 从 v3.0 开始可用,对吗?所以,在 3.0 版本之前。 FBO 是通过扩展提供的,而扩展可能不可用。当 FBO 扩展丢失时需要回退。那正是我所想。无论如何,我会尝试 pbuffer 和 FBO 扩展解决方案。
  • 没错。我相信在 FBO 在 3.0 中成为标准之前有多个 FBO 扩展。我的理解是,FBO 功能在 3.0 之前已经存在了很长一段时间,但是 ARB 在就应该如何定义标准版本达成共识时遇到了问题。
【解决方案2】:

只需使用 FBO 扩展。 FBO 是驱动程序功能,而不是硬件功能,即使是最古老的 GPU(我说的是不支持着色器,只是普通的旧固定功能管道)也可以执行 FBO。我还在使用旧的 GeForce-2(1998 年推出的那个)(在我用于数据考古的旧计算机中;它有 ZIP 驱动器、并行 SCSI 总线等),甚至那个也可以做 FBO。

https://www.opengl.org/registry/specs/ARB/framebuffer_object.txt

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2011-04-20
    • 2013-01-24
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    相关资源
    最近更新 更多