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

Вернуться   Форум Flasher.ru > Flash > Pixel Bender/AGAL

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
По умолчанию Поддержка AGAL2 на мобильной платформе (Starling)

Кто нибудь в курсе, где можно найти информацию по поддержке AGAL версий 2 на мобильных устройствах? По какой то причине, у меня не работает кастомный фильтр старлинга, использующий версию AGAL 2. При запуске на пк всё отлично, при запуске на девайсе приложение зависает при попытке применения фильтра.

Исходный код кастомного фильтра для Starling 2:
Код AS3:
package volkov.starling.filter
{
	import starling.filters.FragmentFilter;
	import starling.rendering.FilterEffect;
 
	/**
	 * Оверлей.
	 * Аналогичен обычному overlay эффекту в фотошопе.
	 * Имеет два режима работы, с чб изображениями и цветными.
	 * Если вам нужно раскрашивать только черно белые текстуры, передайте в конструктор специальный флаг. Это повысит скорость работы фильтра за счёт уменьшения вычислений в шейдере.
	 * Starling 2.0, AGAL2
	 * @author Roman A.V.
	 */
	public class OverlayFilter extends FragmentFilter
	{
 
		// Приват
		private var _color:uint;
		private var _onlyBwTexture:Boolean;
 
		/**
		 * Создать фильтр оверлея.
		 * @param	color Цвет в формате RGB.
		 * @param	onlyBwTexture Обработка только черно белых изображений. (Повышение быстродействия шейдера)
		 */
		public function OverlayFilter(color:uint = 0x000000, onlyBwTexture:Boolean = false)
		{
			super();
 
			_onlyBwTexture = onlyBwTexture;
			this.color = color;
		}
 
		// ПРИВАТ
		override protected function createEffect():FilterEffect
		{
			return new OverlayEffect(_color, _onlyBwTexture);
		}
 
		private function get overlayEffect():OverlayEffect
		{
			return this.effect as OverlayEffect;
		}
 
		// ГЕТТЕРЫ
		/**
		 * Обработка только черно белых изображений.
		 * Если выставлено значение true, фильтр будет корректно обрабатывать только черно белые изображения.
		 */
		public function get onlyBwTexture():Boolean
		{
			return _onlyBwTexture;
		}
 
		// ГЕТТЕР-СЕТТЕРЫ
		/**
		 * Цвет в формате RGB.
		 */
		public function get color():uint
		{
			return _color;
		}
 
		public function set color(value:uint):void
		{
			if (value === _color)
				return;
 
			_color = value;
			overlayEffect.setColor(value);
			setRequiresRedraw();
		}
	}
}
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import starling.rendering.FilterEffect;
import starling.rendering.Program;
import starling.utils.Color;
 
class OverlayEffect extends FilterEffect
{
 
	static private const CONSTANTS:Vector.<Number> = new <Number>[0.5, 1, 3, 0];
 
	// Приват
	private var _colorVec:Vector.<Number>; // Цвет шейдера.
	private var _onlyBwTexture:Boolean; // Только чеерно белые текстуры.	
 
	/// Создать эффект оверлея.
	public function OverlayEffect(color:uint, onlyBwTexture:Boolean)
	{
		super();
 
		_colorVec = new Vector.<Number>(4, true);
		_onlyBwTexture = onlyBwTexture;
		setColor(color);
	}
 
	// ПАБЛИК
	public function setColor(color:uint):void
	{
		_colorVec[0] = Color.getRed(color) / 255.0; // RED
		_colorVec[1] = Color.getGreen(color) / 255.0; // GREEN
		_colorVec[2] = Color.getBlue(color) / 255.0; // BLUE
		_colorVec[3] = 1.0; // ALPHA
	}
 
	override protected function createProgram():Program
	{
		var vertexShader:String = FilterEffect.STD_VERTEX_SHADER;
		var fragmentShader:String;
 
		// Режим работы:
		if (_onlyBwTexture)
		{
			fragmentShader = tex("ft0", "v0", 0, texture) +
 
			// Цвет ближе к черному или белому:
			// (Берём среднее значение цвета сразу  из красного канала)
			"ifl ft0.x, fc1.y \n" + "mull ft0.xyzw, ft0.xxxw, fc0.xyzw \n" + "els \n" + "sub ft0.x, ft0.x, fc1.y \n" + // <-- Количество чистого белого.
			"sub ft0.y, fc1.y, ft0.x \n" + // <-- Количество цвета.
			"mul ft1.xyz, ft0.yyy, fc0.xyz \n" + // <-- Цвет пиксела.
			"add ft0.xyz, ft0.xxx, ft1.xyz \n" + // <-- Итоговый цвет с добавлением белого.
			"eif \n" + "mov oc, ft0 \n";
		}
		else
		{
			fragmentShader = tex("ft0", "v0", 0, texture) +
 
			// В ft0.x получаем чернобелый цвет пикселя:
			"add ft0.x, ft0.x, ft0.y \n" + "add ft0.x, ft0.x, ft0.z \n" + "div ft0.x, ft0.x, fc1.z \n" +
 
			// Находим количество цвета в пикселе, где 1 - чисто серый:
			"div ft0.x, ft0.x, fc1.x \n" +
 
			// Цвет ближе к черному или белому:
			"ifl ft0.x, fc1.y \n" + "mull ft0.xyzw, ft0.xxxw, fc0.xyzw \n" + "els \n" + "sub ft0.x, ft0.x, fc1.y \n" + // <-- Количество чистого белого.
			"sub ft0.y, fc1.y, ft0.x \n" + // <-- Количество цвета.
			"mul ft1.xyz, ft0.yyy, fc0.xyz \n" + // <-- Цвет пиксела.
			"add ft0.xyz, ft0.xxx, ft1.xyz \n" + // <-- Итоговый цвет с добавлением белого.
			"eif \n" + "mov oc, ft0 \n";
 
		}
 
		return Program.fromSource(vertexShader, fragmentShader, 2);
	}
 
	override protected function beforeDraw(context:Context3D):void
	{
		super.beforeDraw(context);
 
		context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, _colorVec);
		context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 1, CONSTANTS);
	}
}
Буду рад любой помощи.

Добавлено через 1 час 49 минут
Получил ответ на форуме старлинга. Кому интересно, причина в том, что AGAL2 работает только при режимах Context3DProfile.STANDARD, Context3DProfile.STANDARD_CONSTRAINED и Context3DProfile.STANDARD_EXTENDED.

http://doc.starling-framework.org/cu...g.html#profile
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 24.11.2016 в 17:35. Причина: Уточнение
Старый 24.11.2016, 18:32
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 2  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Кроме этого ещё нужно указать миниассемблеру версию компиляции шейдера. Хотя в старлинге это делается автоматически.
__________________
Я заклинаю вас действовать иначе.

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
В версий Starling 2.x немного поменялось устройство фильтров, версию шейдера нужно передать самостоятельно, в строке:
Код AS3:
return Program.fromSource(vertexShader, fragmentShader, 2);
И ещё, не используйте этот класс примера как есть, он с багами.
__________________
Дети не должны знать о своих родителях

Старый 24.11.2016, 20:58
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Переписал фильтр на agal1, теперь работает везде как надо. Если кому то вдруг тоже пригодится, исходник в архиве.
Вложения
Тип файла: zip OverlayFilter.zip (1.5 Кб, 228 просмотров)
__________________
Дети не должны знать о своих родителях

Старый 25.11.2016, 05:48
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Что он делает?
__________________
Ко мне можно и нужно обращаться на ты)

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Применяет эффект оверлея к экранному объекту, которому назначен. "Перекрытие" в фотошопе называется.
__________________
Дети не должны знать о своих родителях

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

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
overlay можно сделать и так
Код AS3:
BlendMode.register("overlay",  Context3DBlendFactor.DESTINATION_COLOR, Context3DBlendFactor.DESTINATION_ALPHA);
__________________
freelance | Раздор

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

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

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


 


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


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