Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Shader роняет флэш (http://www.flasher.ru/forum/showthread.php?t=137100)

mrMEM 04.03.2010 16:05

Shader роняет флэш
 
код шейдера масштабирующего картинку:
Код:

<languageVersion : 1.0;>

kernel BilinearResample
<  namespace : "com.brooksandrus.pixelbender";
    vendor : "Brooks Andrus";
    version : 1;
    description : "Resizes an image using bilinear resampling. Constrains aspect ratio - divide Math.max( input.width / output.width, input.height / output.height ) and pass in to the scale parameter";
>
{
    parameter float scale
    <
        minValue: 0.0;
        maxValue: 1000.0;
        defaultValue: 1.0;
    >;
   
    input image4 src;
    output pixel4 dst;

    void
    evaluatePixel()
    {
        // scale should be Math.max( src.width / output.width, src.height / output.height )
        dst = sampleLinear( src, outCoord() * scale ); // bilinear scaling
    }
}

а вот его использование:
Код AS3:

        public function resampleBitmap(desiredWidth:int, desiredHeight:int, cleanup:Boolean = true ):BitmapData{        
        var input:BitmapData = bitmap.bitmapData.clone();
 
            var outputWidth:Number;
            var outputHeight:Number;
 
                                if (input.width>desiredWidth){
                                        outputWidth = desiredWidth;
                                        outputHeight = outputWidth/input.width*input.height;
                                }
                                else{
                                        outputWidth = input.width;
                                        outputHeight = outputWidth/input.width*input.height;
                                }
                                if (outputHeight>desiredHeight){
                                        outputHeight = desiredHeight;
                                        outputWidth = outputHeight/input.height*input.width;
                                }
 
 
            var factor:Number = Math.max( input.width/outputWidth, input.height/outputHeight );
 
            // create and configure a Shader object
            var shader:Shader = new Shader();
            shader.byteCode = BilinearScalingLoader.data;
            shader.data.src.input = input; // supply the shader with BitmapData it will manipulate
            shader.data.scale.value = [factor]; // scale factor. shader params are all stored in arrays.
 
 
            // create a bitmap - our shader will return its data (an image) to this bitmap
            var output:BitmapData = new BitmapData( outputWidth, outputHeight );
 
            // shader jobs are wicked cool
            var job:ShaderJob = new ShaderJob();
            job.target = output; // ShaderJob returns to this object
            job.shader = shader; // The Shader assigned to this job
            job.start( true ); // true flag runs the job synchronously.
 
            if ( cleanup ){
                input.dispose();
            }
 
            return output;
        }

resampleBitmap вызывается с параметрами 600, 600
bitmap - является загруженой Bitmap
BilinearScalingLoader - содержит заранее подгруженый шейдер

в итоге после вызова функции resampleBitmap операционная система просит закрыть приложение

chabapok 04.03.2010 16:50

Я бы поступил так.

делим эту функцию пополам и вторую половину - каментим. Запускам. Если окно не появилась - значит ошибка в этой половине. Дальше делим эту половину... И так пока не найдем строчку, в которой вылетает. Ну или пошаговой отладкой локализируйте место.

И дальше отпишитесь какая строчка валит приложение и уже тогда по обстоятельствам думать надо.

p.s. Шейдер ведь скомпилен с поддержкой flash?
Так же, полезно привести код как вы его грузите и как(и когда) запускаете. А то может вы его запускаете до того, как он загрузился. Мало ли.

mrMEM 04.03.2010 18:14

вылетает на строчке:
job.start( true );

при том, когда картинки имеют относительно большое разрешение порядка 2000px, не зависимо от того какой параметр масштабирования

экспериментирую дальше

может быть нужно дождаться завершение работы Job-a

chabapok, спасибо за совет

Добавлено через 20 минут
хотя в документации написано, что параметр true в job.start( true ); означает, что операции проводятся в основном потоке выполнения программы.

оказывается, я накасячил вначале
параметры desiredWidth, desiredHeight имели исходные размеры картинки.

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

chabapok 04.03.2010 19:39

Попробуйте в шейдере вместо sampleLinear юзать sample. Там тогда размытие при масштабе получается типа эффекта blur, а не квадратики. (как называется - не знаю)

Я не очень понял, почему desiredWidth, desiredHeight -- это косяки, работать-то оно должно? Деления на ноль там вроде не возникает и уж точно не должно валить систему.

А вот большое разрешение - плохо. Где-то там в хелпе писали, что не более (насколько помню) ~2500 должно получаться в результате. Если работает - хорошо, если нет - лучше отладить на малом изображении, и убедившись что все ок пробовать на большом.


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

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