![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Ничего странного. Это работает только по-случайности. Будь бэкграундом другой цвет, все было бы иначе.
Например, конечный цвет вычисляется так: Возьмем цвет [1, 1, 1, 0.5]. Во флэше он будет храниться как [0.5, 0.5, 0.5, 0.5]. В случае с context3D.setBlendFactors(Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA); ONE_MINUS_SOURCE_ALPHA = 1 - 0.5 = 0.5 Бекграунд возьмем [0, 0, 1] Итого получаем [0.5, 0.5, 0.5] * 0.5 + [0, 0, 1] * 0.5 = [0.25, 0.25, 0.25] + [0, 0, 0.5] = [0.25, 0.25, 0.75]. Если мы поделим в шейдере цвет на альфу, то получим Т.е. цвет не потеряли. Если же не делить в шейдере и взять то получим [0.5, 0.5, 0.5] * 0.5 + [0, 0, 1] * 1 = [0.25, 0.25, 0.25] + [0, 0, 1] = [0.25, 0.25, 1.25], Но если взять другой цвет ([0, 0, 1, 0.5]) и другой бэкграунд ([1, 1, 1]), то получим что округлится до [1, 1, 1], т.е. мы потеряем цвет. Upd: пока писал, уже ответили )
__________________
http://volgogradetzzz.blogspot.ru/ |
|
|||||
|
Регистрация: May 2009
Сообщений: 26
|
Партизан. Я на цветную картинку заменил исходник, чтобы продемонстрировать:
![]() Правая картинка получилась с использованием Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE Как видишь, цвет фона влияет складывается со всем изображением. (если бы там было что-то нарисовано, то оно бы прямо просвечивало) А я хочу добиться, чтобы получилась как нижняя картинка. |
|
|||||
|
Регистрация: May 2009
Сообщений: 26
|
Партизан, для данного шейдера ты прав!
(И насчет перевернутого изображения, да, так и должно быть, мой косяк, перепутал немного координаты)Я использую более сложный шейдер, чем в демке. Текстура умножается на цвет вертекса либо на другую текстуру (с использованием альфы), и тут, увы, уже так просто не прокатит. НО! Можно внести в шейдер дополнение - умножение финального цвета на альфу. К сожалению, это увеличит шейдер . Правда, качество будет наверно выше, чем в другом решении (с делением на альфу).Добавлено через 3 минуты Попробовал использовать ATF текстуры, а не png. Первые результаты вселяют надежду. На PC - сжатые текстуры перегоняются в GPU без всяких глупостей вроде premultiplied alpha. Но надо еще поэсперементировать со всеми форматами. Добавлено через 51 час 14 минут Итак, резюмирую. Было найдено три варианта решения: 1. Вариант от Волгоградца http://volgogradetzzz.blogspot.de/20...ied-alpha.html, ссылку на который предоставил Zebestov: Добавить в шейдер деление на альфу. Плюс: + Просто и элегантно. Минусы: - Лишняя операция в шейдере. - По арифметическим причинам возможны небольшие отклонения в цветопередаче. - При рендеринге без блендинга, но с альфа-отсечением, черный ободок всетаки может иногда проявляться. 2. Вариант на основе предложения Партизана: Вместо Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA Использовать Context3DBlendFactor.ONE, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA. И доработать шейдер в зависимости от дополнительных нужд (если, например, нужен еще цвет вершины, то добавить операцию умножения результирующего цвета на альфу вершины) Плюсы и минусы примерно как в предыдущем варианте. 3. Использовать ATF-текстуры. Я проверил разные варианты сжатые/несжатые, PC/Android. Все текстуры загружаются в GPU в исходном, неизмененном виде. Плюс: + Всю наконец работает так, как и должно. + Можно не менять шейдеры + Автоматом доступна возможность использовать сжатые (на уровне GPU) текстуры (dxt1/5). Минусы: - Инструментарий для работы с ATF весьма скуден и не особо функционален. - Если есть необходимость сочетать в рамках одного движка сжатые/несжатые, с альфой/без альфы текстуры, надо пердусматривать отдельные шейдеры для разных видов текстур. Лично для себя выбрал 3-й вариант. Правда, из-за желания зарезервировать возможность сочетать в одном рендеренге сжатые и несжатые текстуры и текстуры с альфой/без альфы, количество шейдеров возросло с 4-х до 30-ти. Но это вроде не страшно. |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:14. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| blending , Stage3d , texture |
|
|