Цвета не смешиваются должным образом в OpenGL ES

Я пытаюсь отобразить 2 (светлых) круга в OpenGL ES в 2D. Середина белая, кайма черная. Он отлично работает, пока они не перекрываются:

введите здесь описание изображения

Но как только они это сделают, я получаю этот артефакт:

введите здесь описание изображения

Я использую glBlendFunc(GL_ONE, GL_ONE) с включенным смешиванием, конечно.

Что может быть причиной этого? Есть ли способ это исправить?

Я бы хотел, чтобы они смешались больше, как это:

введите здесь описание изображения

Спасибо!


person DrummerB    schedule 05.08.2012    source источник


Ответы (2)


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

Однако, исходя из вашего примера, похоже, вам нужна максимальная интенсивность двух кругов, а не сумма интенсивностей. Похоже, что реализация Apple OpenGL ES 2.0 поддерживает расширение EXT_blend_minmax, которое позволяет вы указываете, что результирующие значения фрагмента должны быть максимальными из входящих и существующих значений. Может быть, попробовать это?

person Jesse Rusak    schedule 05.08.2012
comment
Да, я использую линейные градиенты. попробую разные. - person DrummerB; 05.08.2012
comment
@DrummerB Я добавил еще одно предложение; получается максимально возможно, по крайней мере с расширением. - person Jesse Rusak; 05.08.2012

Результат, который вы видите, именно тот, который должен получиться для линейных градиентов. Подсказка: откройте Photoshop или GIMP, нарисуйте два радиальных градиента в два слоя и установите для них режим наложения «Сложение». Он будет выглядеть точно так же, как ваша картина.

Эффект, подобный желаемому, достигается с помощью квадратных градиентов. Если ваш градиент находится в диапазоне 0…1, возьмите квадрат значения и нарисуйте его. Вы можете применить sqrt позже, если хотите линеаризовать отдельные градиенты.

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

person datenwolf    schedule 05.08.2012