opengl - смешивание с предыдущим содержанием кадрового буфера

Я представляю к структуре через объект кадрового буфера, и когда я тяну прозрачные примитивы, примитивы смешиваются правильно с другими примитивами, оттянутыми на том единственном шаге ничьей, но они не смешиваются правильно с предыдущим содержанием кадрового буфера.

Существует ли способ правильно смешать содержание структуры с новыми входящими данными?

Править: Больше информации requsted, я попытаюсь объяснить более ясно;

blendmode, который я использую, является GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA. (Я полагаю, что это обычно - стандарт blendmode),

Я создаю приложение, которое отслеживает движение мыши. Это проводит линии, подключающие предыдущее положение мыши к текущему положению мыши, и поскольку я не хочу проводить линии снова каждый кадр, я полагал, что потяну к структуре, никогда не очищать структуру и затем просто тянуть прямоугольник с той структурой на нем для отображения его.

Это все хорошо работает, за исключением того, что, когда я тяну формы с альфой меньше чем 1 на структуру, она не смешивается правильно с предыдущим содержанием структуры. Скажем, у меня есть некоторые черные линии с альфой =.6 оттянутых на структуру. Пара тянет циклы позже, я тогда рисую черный круг с альфой =.4 по тем строкам. Строки "под" кругом полностью перезаписываются. Хотя круг не является плоским черным цветом (Он смешивается правильно с белым фоном) нет никаких "более темных строк" под кругом, как Вы ожидали бы.

Если я провожу линии и круг в том же кадре однако, они смешиваются правильно. Мое предположение - то, что структура просто не смешивается с, он - предыдущее содержание. Это похоже, это только смешивается с glclearcolor. (Который, в этом случае <1.0f, 1.0f, 1.0f, 1.0f>),

17
задан staticfloat 31 January 2010 в 20:27
поделиться

1 ответ

Я думаю, что здесь есть две возможные проблемы.

Помните, что все наложенные линии смешаны здесь. . После того, как они смешиваются в текстуру FBO, и снова, когда текстура FBO смешивается над сценой.

Итак, первая возможность заключается в том, что у вас нет смешивания включена при нанесении одной линии над другой в наложении FBO. Когда вы нарисуете на поверхность RGBA со смешиванием, текущий альфа просто написан непосредственно в альфа-канал FBO Ollay. Затем, когда вы смешиваете всю текстуру FBO через сцену, что альфа делает ваши линии полупрозрачными. Поэтому, если вы смешиваете против «мира», но не между элементами наложения, возможно, что смешивание не происходит.

Еще одна связанная проблема: при смешивании одной линии над другой в «стандартной» режиме смеси (SRC Alpha, 1 - SRC Alpha) в FBO, альфа-канал «смешанной» части будет содержать смесь из альфа двух накладных элементов. Это, вероятно, не то, что вы хотите.

Например, если вы нарисуете два 50% альфа-линий над друг другом в наложении, чтобы получить эквивалентный эффект, когда вы блокируете FBO, вам нужен альфа FBO ... 75%. (То есть 1 - (1-.5) * (1-0,5), что произойдет, если вы просто нарисовали две 50% альфа-линии над вашей сценой. Но когда вы нарисуете две 50% строк, вы вы будете Получите 50% альфа в FBO (смесь 50% с ... 50%.

Это вызывает окончательную проблему: предварительно смешивая строки друг с другом, прежде чем смешать их по всему миру, вы меняете Заказ на рисовать. В то время как у вас возникло:

смесь (смесь (смесь (цвет фона, модель), первая строка), вторая строка);

Теперь вы будете иметь

смесь (смесь (первая строка, Вторая строка), смесь (цвет фона, модель)).

Другими словами, предварительно смешивая накладные линии в FBO, изменяют порядок смешивания и, таким образом, изменяет окончательный вид таким образом, вы не хотите.

Во-первых, простой способ обойти это: не используйте FBO. Я понимаю, что это «Go Redesign ваше приложение» вид ответа, но с помощью FBO не самая дешевая вещь, а современные карты GL очень хорошие на рисовых линиях. Таким образом, один вариант будет: вместо смешивания линий в FBO, напишите Геометрия линии в объекте буфера вершины (VBO). Просто расширяйте VBO немного каждый раз. Если вы рисуете меньше, скажите, 40 000 строк за раз, это почти наверняка будет так быстро, как то, что вы делали раньше.

. Несколько новых вершин.)

Если это не вариант (например, если вы нарисуете смесь типов формы или используете смесь состояния GL, так что «запоминание», что вы сделали, намного сложнее, чем просто Накапливая вершины) Тогда вы можете изменить то, как вы рисуете в VBO.

в основном то, что вам нужно сделать, это включить отдельное смешивание; Инициализируйте наложение на Black + 0% Alpha (0,0,0,0) и сочетаются на «Стандартное смешивание» RGB, но добавки, смешающие альфа-каналы. Это все еще не совсем правильно для альфа-канала, но вообще намного ближе - без этого извлеченные районы будут слишком прозрачными.

Затем, когда рисуя ФБО, используйте «предварительно умноженный» альфа, то есть (один, один-минус-SRC-ALPH).

Вот почему требуется последний шаг: когда вы рисуете в FBO, вы уже умножали каждый вызов ничьей на свой альфа-канал (если включено). Поскольку вы рисуете на черном, зеленый (0,1,0,0.5) линия теперь темно-зеленый (0,0,5,0,0,5). Если альфа включена, и вы снова смешиваете, альфа повторно появляется, и у вас будет 0,0,25,0,0,5.). Просто используя цвет FBO как есть, вы избегаете второго умножения альфа.

Это иногда называют «предварительно умноженной» альфа, потому что альфа уже умножена на цвет RGB. В этом случае вы хотите, чтобы он получил правильные результаты, но в других случаях программисты используют его для скорости. (При предварительном умножении он удаляет MULT на пиксель, когда выполняется Blend OP.)

Надеюсь, что поможет! Получение смешивания справа, когда слои не смешиваются в порядке, становится действительно хитрым, и отдельная смесь недоступна на старом оборудовании, поэтому просто рисуя линии каждый раз, когда каждый раз может быть путь наименее страданий.

27
ответ дан 30 November 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: