glReadPixels alpha值问题

时间:2013-01-30 12:06:14

标签: android opengl-es opengl-es-2.0 glreadpixels

我在从Android上的OpenGL纹理中读取alpha通道时遇到问题。我用这种方式打电话给glReadPixels

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

就像测试一样,我制作了一个片段着色器,看起来像这样:

gl_FragColor = vec4(0.5, 0.5, 0.5, 0.5);

对于每个像素,我回到{64,64,64,-1}。

我已经尝试了各种各样的方法来解决为什么alpha的返回方式与RGB值不同,包括在每次渲染之前:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//Tried various blend functions
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

但无论我做什么,它都会回来-1。

这是Android限制还是我错过了什么?

正如笔记一样,如果有任何不同,我会使用屏幕外的FBO。

编辑:如果我这样做:

int[] bits= new int[4];
glGetIntegerv(GL_RED_BITS, bits, 0);
glGetIntegerv(GL_GREEN_BITS, bits, 1);
glGetIntegerv(GL_BLUE_BITS, bits, 2);
glGetIntegerv(GL_ALPHA_BITS, bits, 3);

我回来了{8,8,8,0}。

2 个答案:

答案 0 :(得分:0)

Alpha通道控制混合,它们通常会在使用时失去。 alpha通道中的数据已用于将颜色与数据集中已有的颜色混合。你不能使用:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

并恢复您的Alpha频道。我还要注意,这就是为什么你的RGB值为64而不是128,每个原始值(128)与现有的黑色混合50/50以产生64的RGB。

答案 1 :(得分:0)

解决了问题所在。我的渲染缓冲区存储设置为24位模式。将其更改为32位模式时,它开始工作:

glRenderbufferStorage(GL_RENDERBUFFER, GLES11Ext.GL_RGBA8_OES, w, h);