【发布时间】: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)解决了问题。