Смешать отрицательное значение в framebuffer 0 opengl - PullRequest
0 голосов
/ 25 февраля 2019

Программа рендерит кучу вещей в промежуточный кадровый буфер, который использует нормализованную текстуру без знака для хранения данных.Промежуточный кадровый буфер смешивается с кадровым буфером по умолчанию.Пиксельный шейдер, используемый для визуализации промежуточного звена для смеси с кадровым буфером 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.Это медленно и сложно поддерживать.Есть ли другой способ?

1 Ответ

0 голосов
/ 26 февраля 2019

Есть ли способ отключить привязку выходов фрагментного шейдера к [0, 1]?

Позвольте мне процитировать из раздела 17.3.6 Смешивание из Спецификация профиля ядра OpenGL 4.6 (выделено мной):

Если буфер цвета имеет фиксированную точку, компоненты источника и целевые значения и смеськаждый из факторов фиксируется на [0, 1] или [-1, 1] соответственно для буфера нормализованного цвета без знака или нормализованного цвета со знаком до оценки уравнения смешения. Если буфер цвета с плавающей запятой, фиксация не происходит. Полученные четыре значения отправляются на следующую операцию.

Таким образом, вы можете использовать один из *16F или*32F форматов, чтобы избавиться от зажима.

Я знаю, что не существует способа рендеринга на нормализованную текстуру со знаком, поэтому, возможно, существует ограничение OpenGL, которое предотвращает это.

Спецификация помечает различные _SNORM как рендеринг цвета .Однако в то же время спецификация не помечает эти форматы как , требуемые для поддержки цели рендеринга, поэтому реализации могут позволить вам использовать такой формат, но они нене нужно, так что да, вы никак не можете полагаться на это ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...