这个问题让我疯狂,因为代码之前完美运行。我有一个片段着色器,它根据alpha通道中设置的值组合两个纹理。使用FBO将输出渲染到第三个纹理。
由于我需要对组合纹理执行后处理步骤,因此我检查alpha通道的值以确定该纹素是否需要后处理(即,我使用alpha通道值作为一张面具)。问题是,后处理着色器正在为输入纹理中的所有纹素读取值1.0!
以下是组合两种纹理的片段着色器:
uniform samplerRect tex1;
uniform samplerRect tex2;
in vec2 vTexCoord;
out vec4 fColor;
void main(void) {
vec4 color1, color2;
color1 = texture(tex1, vTexCoord.st);
color2 = texture(tex2, vTexCoord.st);
if (color1.a == 1.0) {
fColor = color2;
} else if (color2.a == 1.0) {
fColor = color1;
} else {
fColor = (color1 + color2) / 2.0;
}
}
我附加到FBO的纹理对象设置如下:
glGenTextures(1, &glBufferTex);
glBindTexture(GL_TEXTURE_RECTANGLE, glBufferTex);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
将纹理附加到FBO的代码是:
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_RECTANGLE, glBufferTex, 0);
在添加FBO之前,我甚至添加了对glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
的调用!可能出现的问题是使下一个阶段片段着色器读取所有纹素的1.0?
注意:我确实检查过,并非我合并的两个纹理中纹素的alpha通道的所有值都是1.0。其中大部分实际上都不是。