【问题标题】:How to load output of openGL glReadpixels() into bitmap memory如何将 openGL glReadpixels() 的输出加载到位图内存中
【发布时间】:2016-03-24 12:49:51
【问题描述】:

我已经编写了代码以使用 openGL ES 3.0 将 YUV 转换为 RGB。我不想将转换后的图像显示到 glViewPort 表面,而是将其存储在位图内存中。 我使用了 openGL 帧缓冲区和渲染缓冲区(渲染到纹理),然后尝试使用 glReadpixels() 函数获取输出。我正在获取输出,但我不知道如何将输出上传到位图内存中。请帮忙。

【问题讨论】:

  • 谢谢,是的,我正在使用 2D 图像并使用 glTexImage2D() 我将数据从系统内存发送到纹理内存并完成了一些处理。现在我想在应用着色器和纹理后读取输出,为此我使用了 glReadpixels()。现在我想在我的屏幕上使用那个输出图像

标签: android c++ opengl-es bitmap


【解决方案1】:

如果您在客户端(系统)内存中有图像数据,并且想要将其发送到纹理内存,您可以使用glTexImage2D(我假设您有一个 2D 图像)。

但是,如果我了解您的用例,渲染到渲染缓冲区,使用 glReadPixels 将结果读取到系统内存中,然后使用该数据创建新纹理,这有点奇怪。通常,您只需附加一个纹理作为帧缓冲区的颜色输出,然后直接使用它。这将绕过到系统内存的往返,这很昂贵。

【讨论】:

  • 我为 y u 和 v 组件使用了三个纹理。如果我将这些纹理附加到帧缓冲区,则帧缓冲区状态已完成。但是当我从帧缓冲区读取输出时,我无法获得最终的 RGB 图像。相反,它正在从帧缓冲区读取任何一个纹理输入。我需要读取 YUV 到 RGB 转换的最终输出以存储它以供进一步处理
  • 如果您将 YUV 从着色器中的 3 个输入纹理转换为 RGB 帧缓冲区,则 YUV 纹理不应附加到帧缓冲区,它们应该是着色器的统一输入。
  • 所以实际上我不想在表面视图中输出。我需要将 YUV 的输出到 RGB 存储到缓冲区中。如果不将纹理附加到 Framebuffer,我如何访问输出?有没有其他方法可以从缓冲区获取 YUV 到 RGB 输出?
  • 帧缓冲区是渲染目标。默认帧缓冲区(在 Android 上下文中)是表面视图的帧缓冲区,但您可以创建其他帧缓冲区来执行“离屏”渲染。查看基本的渲染到纹理教程。
  • 我为屏幕外渲染创建了帧缓冲区。创建三个纹理(Y、U 和 V)组件并将这些纹理附加到帧缓冲区。当我使用 glReadPixels() 从帧缓冲区获取最终输出时,我只得到红色图像。但我需要显示 RGB 图像。该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多