【问题标题】:Best way to access pixel in OpenGL?在OpenGL中访问像素的最佳方法?
【发布时间】:2010-11-08 12:14:27
【问题描述】:

我几乎是 opengl 的新手。我想 glReadPixels 很可怕,那么最好的方法是什么?我正在考虑使用一个锁定纹理矩形的功能,执行 glTexSubImage2D 之类的操作将像素复制到 RAM,对其进行修改,然后使用 glTexSubImage2D 将 ram 复制回纹理中。这是一个好方法吗?我可以将优化想象成一个标志,表示不要复制纹理,因为您将全部覆盖并缓存。

我还可以使用哪些其他方法?谁能告诉我我可能想要的 gl 函数的名称(以便我可以阅读手册)或指向我的教程?我尝试使用谷歌搜索,但大多数结果看起来不像我想的那样。

【问题讨论】:

  • 您能详细说明您要做什么吗? Nils 是对的,如果您真的需要,请使用 glReadPixels,但不要指望它会很快。如果您解释一下您要做什么,也许这里有人可以提出更好的方法并避免完全读取像素的需要。
  • 其次是 OJ 的请求。需要检索实际像素的东西很少(渲染)。

标签: opengl


【解决方案1】:

glReadPixels 是要走的路。

是的,它很慢——慢得可怕。但事实就是这样。 DirectX 对应物(例如锁定和读取像素)也不会快多少。

一般来说,您希望避免读回像素并使用 CPU 处理数据。您可以使用像素着色器进行相当多的处理,但如果您想做屏幕截图(数据必须在 CPU 中结束),这将无济于事。

【讨论】:

    【解决方案2】:

    如前所述,glReadPixels 是要走的路。 使读取帧缓冲区或访问像素更快的一种方法是使用 ARB_pixel_buffer_object 扩展。这将使您可以异步执行 glReadPixels,并且当您需要读取大量像素时性能会更快。性能会更快,因为如果您使用“正确”的格式,传输是使用 DMA 完成的,不会消耗宝贵的 CPU 周期。

    【讨论】:

    • 关于如何使用ARB_pixel_buffer_object extension的任何示例?
    【解决方案3】:

    最好的办法是将视频卡上的帧缓冲存储器视为只写。我认为原因是视频内存针对从 CPU 端写入进行了优化,但以牺牲读取为代价。 (显然显存可以从显卡端快速读取——它必须实时发送到显示器)

    最快的解决方案将取决于您要做什么(需要详细说明吗?)。

    没有什么能阻止您将自己的帧缓冲区保存在主内存中,然后将其复制到每帧的纹理并在 OpenGL 中渲染。我以前做过这个,它比 glReadPixels 快得多,但是你失去了读取其他 OpenGL 渲染活动结果的能力。如果您需要做的就是保持场景一部分的逐帧状态,请使用它。例如:生成无法通过像素着色器完成的动态纹理。

    您还可以通过回读一组小得多的数据而侥幸逃脱。当我在玩非现实渲染时,我这样做了。我拍摄了我的场景,将其渲染为 160x120,将其读回主内存,然后将其重新渲染为 2D 精灵的集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2011-09-13
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多