Показать сообщение отдельно
Старый 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. Причина: Уточнение