【问题标题】:is it possible to render to framebuffer object outside of main render loop是否可以在主渲染循环之外渲染到帧缓冲区对象
【发布时间】:2011-05-05 07:06:42
【问题描述】:

我正在使用单独的帧缓冲区对象在 opengl 中拾色 2d 对象。我很好奇它是否可以只绘制到帧缓冲区并在需要时读取颜色。

我现在正在做的是在主渲染循环中,我将场景绘制到主帧缓冲区,然后仅将可选对象渲染到“拾取”帧缓冲区。

当用户单击鼠标时,它会绑定“拾取”帧缓冲区并读取像素,我知道选择了哪个对象。这样做的问题是,当用户单击鼠标时,我只需要“挑选”帧缓冲区,因此每帧都这样做效率低下。

当用户单击鼠标然后直接读取时,我尝试渲染到“拾取”帧缓冲区,但我得到的只是白色(背景颜色而不是告诉我它是哪个对象的颜色)。绘制“拾取”帧缓冲区只是将整个事物显示为白色,就像根本没有实际渲染它一样。

渲染到“拾取”帧缓冲区时是否需要停止在主循环中绘制?还是我缺少一些东西可以使这成为可能?

编辑:我尝试在渲染到拾取帧缓冲区时不在主循环中绘图,但这也不起作用。

【问题讨论】:

  • 您在抽奖和阅读之间是否glFlush()
  • 我愿意。我认为“否”的答案可能是正确的。
  • 你是同时做的吗?
  • 不。我尝试了所有我知道的顺序方式,唯一有效的方式是在渲染正常帧缓冲区的同时渲染拾取 fbo,这在现代硬件上并不是什么大问题(可能是 5%),但在旧的东西上它可能更接近约 30-40% 的性能损失。
  • 如果您不在多线程应用程序中,并且只有一个上下文,那应该可以。检查为什么您的 FBO 渲染必须在正常渲染之后进行。 (矩阵,纹理,...)

标签: opengl colors framebuffer picking


【解决方案1】:

您需要检查您是否使用wglMakeCurrentglXMakeCurrent 将您的总帐上下文设置为当前上下文。此外,它必须在同一个线程中完成,因为只有一个线程可以拥有 current 上下文。

【讨论】:

  • 我尝试确保上下文是正确的,结果相同。
【解决方案2】:

“不”。

但您可以使用多个 GPU(如果有的话)。 Herehere 可以找到 OpenGL 规范;驱动程序必须支持 *WGL_NV_gpu_affinity* 或 *AMD_gpu_association* 扩展。

【讨论】:

  • 这将防止在 两个 OpenGL 上下文上同时在不同线程上渲染时出现性能问题。但您需要专业的 GPU 才能访问这些扩展。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多