我在安卓系统上读回我的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 }。
发布于 2013-01-30 22:22:12
找出了问题所在。我的渲染缓冲区存储被设置为24位模式。当将其更改为32位模式时,它开始工作:
glRenderbufferStorage(GL_RENDERBUFFER, GLES11Ext.GL_RGBA8_OES, w, h);发布于 2013-01-30 20:10:55
Alpha通道控制混合,它们通常在使用时就会丢失。alpha通道中的数据已用于将您的颜色与数据集中已有的颜色混合。您不能使用:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);找回你的alpha通道。我还要注意到,这就是为什么你的RGB值得到64而不是128的原因,每个原始值(128)已经与现有的黑色50/50混合,产生RGB为64。
https://stackoverflow.com/questions/14603610
复制相似问题