Программа рендерит кучу вещей в промежуточный кадровый буфер, который использует нормализованную текстуру без знака для хранения данных.Промежуточный кадровый буфер смешивается с кадровым буфером по умолчанию.Пиксельный шейдер, используемый для визуализации промежуточного звена для смеси с кадровым буфером 0, выглядит следующим образом:
#version 300 es
precision mediump float;
out vec4 fragColor;
in vec2 texCoords;
uniform sampler2D textureToDraw;
void main()
{
vec4 sampleColor = texture(textureToDraw, texCoords);
fragColor = vec4(sampleColor.rgb * -1.0, sampleColor.a);
}
Код для настройки рисования в кадровый буфер 0 выглядит следующим образом:
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// Draw the intermediate using the pixel shader above and a quad
Компоненты rgb fragColor
будут в диапазоне [-1, 0].Ожидаемый результат состоит в том, что промежуточный цвет вычитается из предыдущего содержимого кадрового буфера.Фактический результат состоит в том, что черный цвет смешивается с правильной альфа-структурой с кадровым буфером 0, что указывает на то, что fragColor
где-то ограничен [0, 1], а отрицательная часть отбрасывается.
Есть ли способотключить привязку выходов фрагментного шейдера к [0, 1]?
Я знаю, что не существует способа визуализации в нормализованную текстуру со знаком, поэтому, возможно, существует ограничение OpenGL, которое предотвращает это.Альтернатива, о которой я думаю, - это два прохода рендеринга, один из которых переводит отрицательные биты в промежуточный, а другой - в положительные биты в другой промежуточный.В конце смешайте положительное с GL_FUNC_ADD
и отрицательное с GL_FUNC_REVERSE_SUBTRACT
.Это медленно и сложно поддерживать.Есть ли другой способ?