我在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);