Значение альфа-канала всегда возвращает 1.0 после рендеринга в текстуру в OpenGL

Эта проблема сводит меня с ума, так как раньше код работал отлично. У меня есть фрагментный шейдер, который объединяет две текстуры на основе значения, установленного в альфа-канале. Вывод визуализируется в третью текстуру с использованием FBO.

Поскольку мне нужно выполнить шаг постобработки комбинированной текстуры, я проверяю значение альфа-канала, чтобы определить, потребуется ли этому текселу постобработка или нет (т. е. я использую значение альфа-канала в качестве маски) . Проблема в том, что шейдер постобработки считывает значение 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);

Я даже добавил вызов glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) перед подключением FBO! Что может пойти не так, из-за чего фрагментный шейдер следующего этапа читает 1.0 для всех текселей?!

ПРИМЕЧАНИЕ. Я проверил, что не все значения альфа-канала для текселей в двух текстурах, которые я объединяю, равны 1,0. Большинство из них на самом деле не таковы.


person informer2000    schedule 25.11.2013    source источник
comment
У вас включено смешивание? Если это так, предыдущее значение в текстуре может создавать ваши 1s.   -  person jozxyqk    schedule 25.11.2013
comment
@jozxyqk Смешивание не отключено. Кажется, я понял, в чем проблема. Но я все еще пытаюсь понять, что происходит и почему я смог получить вывод до определенного этапа. Это была отсутствующая строка для привязки объекта текстуры к GL_TEXTURE_RECTANGLE, которую я забыл добавить, когда интегрировал код в другой модуль.   -  person informer2000    schedule 26.11.2013