Кто нибудь в курсе, где можно найти информацию по поддержке AGAL версий 2 на мобильных устройствах? По какой то причине, у меня не работает кастомный фильтр старлинга, использующий версию AGAL 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);
}
}
Получил ответ на форуме старлинга. Кому интересно, причина в том, что AGAL2 работает только при режимах Context3DProfile.STANDARD, Context3DProfile.STANDARD_CONSTRAINED и Context3DProfile.STANDARD_EXTENDED.