【问题标题】:Bitmap quality using glReadPixels with frame buffer objects使用带有帧缓冲区对象的 glReadPixels 的位图质量
【发布时间】:2015-06-24 02:33:09
【问题描述】:

在使用 OpenGL 2 从 Android 上的帧缓冲区对象导出位图时遇到以下问题。

我将图像加载到 OpenGL 并显示在屏幕上。加载的图像比实际屏幕大,因此我进行了一些矩阵操作以使其适合屏幕。

然后我尝试将图像导出回原始大小的位图并保存或显示在屏幕上。为此,我创建了一个帧缓冲区对象,将其绑定到当前的 OpenGL 上下文,“绘制”纹理并使用glReadPixels 创建一个Bitmap

这是原始图像(当然调整大小以适合此处),当我将其加载到 OpenGL 时,我可以在屏幕上正确看到它:

这是导出的图像(当然调整大小以适合此处):

如您所见,导出的图像有一些较暗的区域。我是否缺少任何标准配置?

我在适合屏幕的较小纹理上也遇到了这个问题。但较暗的区域有点不同——相反,人们可以看到较亮的点。

我确定这不是我的矩阵操作,因为当从我的着色器中删除矩阵乘法时,我仍然遇到这个问题。

【问题讨论】:

  • 我不希望 glReadPixels() 引入问题。我的猜测是在缩放或纹理采样期间引入了伪影,但无论图像是否缩放,听起来你都会看到这一点。您能否确认您使用的是 32 位颜色缓冲区,并且在渲染 1:1 时会出现问题? FWIW,仔细查看数字的底部,看看你在哪里失去了一些清晰度。
  • 除了@fadden已经指出的,你也可以试试打电话glDisable(GL_DITHER),看看有没有什么不同。我不认为它适用于 8 位/组件格式,但如果您要渲染为 RGB565 之类的格式,则很可能会。
  • @fadden,如何查看我是否使用 32 位颜色缓冲区?很抱歉与清晰度混淆,我手动缩放它们 - 第一个来自屏幕截图,另一个来自其他地方,所以它们看起来并不完全相同。
  • @RetoKoradi,你是对的,我使用 RGB565 并添加 glDisable(GL_DITHER) 解决了问题。

标签: android opengl-es bitmap


【解决方案1】:

添加glDisable(GL_DITHER) 即可解决问题。

感谢@RetoKoradi。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多