1

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

4

2 回答 2

1

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

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

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

于 2013-01-30T12:10:55.023 回答
0

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

glRenderbufferStorage(GL_RENDERBUFFER, GLES11Ext.GL_RGBA8_OES, w, h);
于 2013-01-30T14:22:11.540 回答