glReadPixels alpha value issue



我在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。

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

请注意,如果它有任何区别,我正在使用屏幕外的 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 }。

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

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

并恢复您的阿尔法频道。我还要指出,这就是为什么您的 RGB 值返回 64 而不是 128,每个原始值 (128) 已与现有黑色混合 50/50,以产生 64 的 RGB。

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

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

最新更新