【问题标题】:Open gl es - How to improve performance, render to texture, blendingOpen gl es - 如何提高性能、渲染到纹理、混合
【发布时间】:2016-11-17 20:55:11
【问题描述】:

我在这里是因为我正在开发一个 OpenGL 程序,但我遇到了一些性能问题。我在 iMX6 soc 上使用 OpenGL ES 3.0。

这是我的算法:

  1. 我从相机中得到一张直接映射到纹理的图像。 使用 FBO,我渲染到纹理以将图像映射到特定表单上。

  2. 我对另一个应用程序通过共享内存发送的另一个图像执行相同的操作(使用第二个 FBO)。仅当更新图像时才执行此步骤。每秒只有一次。

  3. 我在默认帧缓冲区中混合这两个纹理以将结果渲染到屏幕上。

如果我分别执行这三个步骤,效果很好,屏幕更新为 30FPS。但是当我在一个程序中包含这三个步骤时,渲染速度非常慢,我只有 0.5FPS。

我想知道iMX6上的GPU是否足够强大,但我认为这不是一个复杂的算法。我认为我以错误的方式做某事,但是什么? 我使用了 3 个不同的帧缓冲区,这是一个好方法还是应该只使用一个?

有人可以给我答案,线索,任何可以帮助我的东西吗? :-)

我的图像尺寸为 1280x1024 x RGBA。然后我正在做一些从浮点纹理到整数再到浮点的转换,这样做是为了对像素执行按位运算。

【问题讨论】:

  • “然后我正在做一些从浮点纹理到整数并返回到浮点的转换,这样做是为了对像素执行按位运算。”我的直觉是,这是缓慢的一点。如果你做一个更简单的混合作为测试(例如输出两个图像的平均值)会发生什么?
  • 感谢您的回答,我现在无法尝试,但我会尽快尝试。使用浮点纹理或整数甚至归一化整数会更好吗? (为了更好的性能)
  • 一些实际的代码和着色器会有所帮助 - 很难根据相当模糊的描述提供具体的建议......
  • 当您从相机获取图像时,它们是流式传输的还是单个图像?通常来自相机的数据采用 YUV 格式。如果您在渲染之前从 YUV 转换为 RGB,这也可能是一个瓶颈。您可以使用 YUV 到 RGB 着色器来渲染图像。
  • 已经用shader完成了转换。

标签: c++ opengl-es fbo


【解决方案1】:

感谢@Columbo,问题来自所有的转换,我使用浮点纹理,并且只针对按位运算进行转换,这大大提高了算法的性能。

另一个降低性能的点是纹理格式。第一步,图像为 1280x1024,但仅在一个合成上(灰度图像)。为了只保留灰度合成并且不使用太多内存,我使用了 GL_RED 纹理,但这不是一个好主意,因为当我将其更改为 GL_RGB 时,渲染的帧速率也增加了一倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多