Альфа-смешение с несколькими текстурами оставляет цветную окантовку - PullRequest
1 голос
/ 16 сентября 2011

Следующая проблема: у меня есть две текстуры, и я хочу объединить их в новую текстуру.Таким образом, одна текстура используется в качестве фона, а другая будет наложена.Текстура наложения инициализируется с помощью glClearColor (1.0, 1.0, 1.0, 0.0).Объекты рисуются на текстуре, эти объекты имеют альфа-значения.

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

Как я могу использовать альфа-смешение, когда мне не нужно думать о цвете фона наложенной текстуры?

Ответы [ 4 ]

5 голосов
/ 19 сентября 2011

Я решил проблему сам, но большое спасибо всем вам, ребята!

Проблема заключалась в следующем: для объединения обеих текстур я использовал glblend (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), который не работает из-за того, что OpenGL использует предварительно умноженные альфа-значения. Смешивание с glblend (GL_ONE, GL_ONE_MINUS_SRC_ALPHA), работает как исходный термин теперь будет: 1 * src_alpha * src_color!

1 голос
/ 16 сентября 2011

Как я могу использовать альфа-смешение, когда мне не нужно думать о цвете фона наложенной текстуры?

Вы не можете; Ваша функция смешивания включает в себя цвет фона, потому что на самом деле это не может быть "фон". Вы рендерите несколько объектов в текстуру, поэтому цвет фона может фактически быть ранее отображенным объектом.

Ваша лучшая ставка - минимизировать влияние. Нет особой необходимости, чтобы цвет фона был белым. Просто сделай это черным. Это не заставит артефакты исчезнуть; надеюсь, это сделает его менее заметным.

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

Но если фон на самом деле прозрачный, без полностью непрозрачного цвета, математика просто перестает работать. Вы получите артефакты; вопрос в том, насколько они будут заметны.

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

0 голосов
/ 20 сентября 2011

Убедитесь, что вы отключили глубинную запись, прежде чем рисовать прозрачную текстуру (чтобы одна прозрачная текстура не могла «блокировать» другую, предотвращая ее отрисовку). Для этого просто позвоните glDepthMask(false). Как только вы закончите рисовать прозрачные объекты, вызовите glDepthMask(true), чтобы установить глубину записи в нормальное состояние.

0 голосов
/ 19 сентября 2011

Хотя я думаю, что вы, вероятно, получите лучшие результаты на черном фоне, как отметил Никол Болас.Но вы должны дважды проверить свои функции смешивания, потому что, как вы отмечаете, это НЕ ДОЛЖНО иметь значение ...

1.0 * 0.0 + 0.734 * 1.0 = 0.734

Чего я действительно не понимаю, так это того, почему ваша базовая текстура полностью прозрачна?Это предназначено?Если вы не смешиваете текстуры, а затем используете их где-то еще, инициализация в Alpha = 1.0 является идеей теста.

...