Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.11.2014, 00:02
VisualDima вне форума Посмотреть профиль Отправить личное сообщение для VisualDima Найти все сообщения от VisualDima
  № 1  
Ответить с цитированием
VisualDima
 
Аватар для VisualDima

Регистрация: May 2009
Сообщений: 26
По умолчанию Texture.uploadFromBitmapData обнуляет RGB канал у прозрачных пикселей

Хочу использовать полпрозрачную текстуру с альфаканалом.
Загружаю из png. Создаю текстур формата Context3DTextureFormat.BGRA. Вызываю Texture.uploadFromBitmapData.
Ставлю обычный альфа-блендинг:
Код AS3:
context3D.setBlendFactors(Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA);
И наблюдаю такую картину: RGB каналы всех прозрачных пикселей (у которых альфа равна 0) заменяются черным цветом (нулями тоесть).
В результате, если увеличить объекты, становятся видны черные края (это происходит из-за сглаживания)

Свой BitmapData я проверил, там все нормально: во всех пикселях (даже в полностью прозрачных) белый цвет.
Должно быть вот-так: (изображение получено из обычного флеша)


Покопав дальше вообще обнаружил, что uploadFromBitmapData весьма своеобразно делает текстуры из полупрозрачных битмапов. Он какбы ренедерит их на черном фоне и записывает полученый результат в RGB канал (альфу при этом копирует правильно).
Т.е. если есть белое полупрозрачное облачко, то после uploadFromBitmapData получаем текстуру с СЕРЫМ полупрозрачным облаком. Дурдом! За такое руки отрывать надо, ИМХО.

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

Старый 17.11.2014, 04:14
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 2  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Ничего подобного Stage3D при загрузке текстуры из битмапы не делает, это же форменный произвол!
Ты в шейдере часом не умножаешь RGB на A?
__________________
Поймай яблоко 2!

Старый 17.11.2014, 14:33
VisualDima вне форума Посмотреть профиль Отправить личное сообщение для VisualDima Найти все сообщения от VisualDima
  № 3  
Ответить с цитированием
VisualDima
 
Аватар для VisualDima

Регистрация: May 2009
Сообщений: 26
Чтобы еще раз все перепроверить, сделал отдельный проект где содержится только то, что нужно для теста.
Вот исходная картинка, как она выглядит в редакторе (фактически, редактировался только альфа-канал, цвет же везде белый 0xffffff):


Шейдер максимально простой (только XYZ и UV)
Код AS3:
			var vertexShaderAssembler:AGALMiniAssembler = new AGALMiniAssembler();
			vertexShaderAssembler.assemble ( Context3DProgramType.VERTEX,
				"m44 op, va0, vc0\n" +
				"mov v0, va0\n" +			// XYZ -> v0
				"mov v1, va1\n"				// UV -> v1
			);      
			var fragmentShaderAssembler:AGALMiniAssembler = new AGALMiniAssembler();
			fragmentShaderAssembler.assemble ( Context3DProgramType.FRAGMENT,  
				"tex ft0, v1, fs0 <2d,repeat,nomip,linear>\n" +  
				"mov oc, ft0\n"                  
			);
			m_pShaderProgram = m_pContext3D.createProgram();
			m_pShaderProgram.upload(vertexShaderAssembler.agalcode, fragmentShaderAssembler.agalcode);
Создание текстуры (mipmapping'а нет):
Код AS3:
			m_pTexture = m_pContext3D.createTexture(m_pBitmap.width, m_pBitmap.height,
                                          Context3DTextureFormat.BGRA, false);
			m_pTexture.uploadFromBitmapData(m_pBitmap.bitmapData, 0);
Вывожу два квада. Слева без блендинга:
Код AS3:
setBlendFactors(Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO)
Справа с обычным блендингом:
Код AS3:
setBlendFactors(Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA)
Внизу просто addChaild'ом добавил копию загруженной битмапы, чтобы проверить, что она загрузилась правильно (собственно, при выводе с блендингом должна быть именно такая картинка).
Вот что получилось в результате:


Либо я чего-то не понимаю, либо да, произвол. Слов нет кроме матерных.
Могу выложить весь проект (сделан в FlashDevelop'е)

Старый 17.11.2014, 15:16
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Если не затруднит, запакуй в zip и выложи непосредственно тот PNG, который ты используешь.
__________________
Поймай яблоко 2!

Старый 17.11.2014, 15:23
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 5  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Я не понял до конца, но если у Вас белый круг в черном квадрате, который Вы пытаетесь скрыть,
то черная обводка это нормально. Если в фотошопе нарисовать белый круг на черном квадрате,
а потом увеличивать, то появятся серые пиксели, это так программа видит масштаб. И ничего с этим не поделать.

Старый 17.11.2014, 15:27
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 6  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Нет. Здесь речь идет скорее всего о premultipled alpha при экспорте изображения в PNG. Поэтому и прошу показать именно файл изображения.

Забегая вперед, если таки да, то вот решение.
__________________
Поймай яблоко 2!

Старый 17.11.2014, 16:10
VisualDima вне форума Посмотреть профиль Отправить личное сообщение для VisualDima Найти все сообщения от VisualDima
  № 7  
Ответить с цитированием
VisualDima
 
Аватар для VisualDima

Регистрация: May 2009
Сообщений: 26
Вот ссылка на исходный png в архиве. https://cloud.mail.ru/public/b2c21a360e37/Bitmapa.zip
Вот на всякий случай весь проект: https://cloud.mail.ru/public/b3343d1...adTexCheck.zip

Zebestov, точно эффект именно как при premultipled alpha. Но такое впечатление, что происходит он именно в момент uploadFromBitmapData.
Ведь на нижнем изображении на картинке эффект не наблюдается, т.е. исходный bitmapData нормальный.

Добавлено через 14 минут
Кстати, Zebestov. Огромное спасибо за ссылку! Как запасной вариант подойдет (устраняет проблему). Но меня смущает лишняя операция деления в шейдере. Не привык я разбрасываться ресурсами системы. Продолжаю копать.
Никак не пойму, почему кто-то в адоб решил что он лучше знает, как должна выглядеть моя текстура. Просто бы скопировали цвветовые данные как я прошу - быстро и просто. Нет, самодеятельность какую-то придумали.

Старый 17.11.2014, 16:56
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 8  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
Вроде решает проблему....
Код AS3:
m_pContext3D.setBlendFactors(Context3DBlendFactor.SOURCE_ALPHA, Context3DBlendFactor.ONE);

Старый 17.11.2014, 17:08
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 9  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от VisualDima Посмотреть сообщение
Но меня смущает лишняя операция деления в шейдере. Не привык я разбрасываться ресурсами системы.
Совершенно с тобой согласен. И кстати, файл таки без premultipled… странно все это.

Добавлено через 2 минуты
Партизан, не решает, потому что в данном случае совершенно идентично — SOURCE_ALPHA же у нас ноль, значит ONE_MINUS_SOURCE_ALPHA и так ONE.

Добавлено через 25 минут
Итак, вот что вычитал уважаемый Волгоградец (автор сайта, который указан выше).

Цитата:
Все пиксели в объекте BitmapData сохраняются как предварительно умноженные значения цвета.

Все методы BitmapData принимают и возвращают неумноженные значения.
Таким образом любое изображение, которое вставляется во Flash (будь то элемент из библиотеки в IDE или изображение, вставленное с помощью тега embed), превращаясь в BitmapData сразу же подлежит предварительному умножению. Таки да. Произвол. Понятно, зачем это сделано, но нам пофиг!

Как видно, никакими getPixel32/setPixel32 ты это не исправишь. Остается лишь пробежаться по содержимому BitmapData как по ByteArray и переделить все RGB на A. И лишь после этого можно отгружать текстуру в GPU.

Однако наш коллега комментирует это так:

– можно переделить, но одно деление в шейдере — это ничто, наносекунды, даже меньше, даже на отстойных телефонах;


P.S.
И да, ты был прав, Flash таки мутит свои дела, оправдывая это вероломство какими-то нелепыми отмазками типа ускорения отрисовки сцены, пфф!
__________________
Поймай яблоко 2!


Последний раз редактировалось Zebestov; 17.11.2014 в 17:37.
Старый 17.11.2014, 17:35
Партизан вне форума Посмотреть профиль Отправить личное сообщение для Партизан Найти все сообщения от Партизан
  № 10  
Ответить с цитированием
Партизан
 
Аватар для Партизан

блогер
Регистрация: Nov 2007
Адрес: Almaty, Moscow
Сообщений: 396
Записей в блоге: 5
Отправить сообщение для Партизан с помощью Skype™
ну как-бы результат такой... Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 186
Размер:	39.6 Кб
ID:	31264

Создать новую тему Ответ Часовой пояс GMT +4, время: 15:04.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
blending , Stage3d , texture

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:04.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.