Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Pixel Bender/AGAL (http://www.flasher.ru/forum/forumdisplay.php?f=100)
-   -   Поддержка AGAL2 на мобильной платформе (Starling) (http://www.flasher.ru/forum/showthread.php?t=213620)

Tails 24.11.2016 14:15

Поддержка 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

Bletraut 24.11.2016 18:32

Кроме этого ещё нужно указать миниассемблеру версию компиляции шейдера. Хотя в старлинге это делается автоматически.

Tails 24.11.2016 18:38

В версий Starling 2.x немного поменялось устройство фильтров, версию шейдера нужно передать самостоятельно, в строке:
Код AS3:

return Program.fromSource(vertexShader, fragmentShader, 2);

И ещё, не используйте этот класс примера как есть, он с багами.

Tails 24.11.2016 20:58

Вложений: 1
Переписал фильтр на agal1, теперь работает везде как надо. Если кому то вдруг тоже пригодится, исходник в архиве.

caseyryan 25.11.2016 05:48

Что он делает?

Tails 25.11.2016 10:33

Применяет эффект оверлея к экранному объекту, которому назначен. "Перекрытие" в фотошопе называется.

derhab 09.12.2016 05:24

overlay можно сделать и так
Код AS3:

BlendMode.register("overlay",  Context3DBlendFactor.DESTINATION_COLOR, Context3DBlendFactor.DESTINATION_ALPHA);



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

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