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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

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

Регистрация: Feb 2009
Сообщений: 63
По умолчанию 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 операционная система просит закрыть приложение


Последний раз редактировалось mrMEM; 04.03.2010 в 16:10.
Старый 04.03.2010, 16:50
chabapok вне форума Посмотреть профиль Отправить личное сообщение для chabapok Найти все сообщения от chabapok
  № 2  
Ответить с цитированием
chabapok

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
Я бы поступил так.

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

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

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

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

Регистрация: Feb 2009
Сообщений: 63
вылетает на строчке:
job.start( true );

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

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

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

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

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

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

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


Последний раз редактировалось mrMEM; 04.03.2010 в 18:43.
Старый 04.03.2010, 19:39
chabapok вне форума Посмотреть профиль Отправить личное сообщение для chabapok Найти все сообщения от chabapok
  № 4  
Ответить с цитированием
chabapok

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
Попробуйте в шейдере вместо sampleLinear юзать sample. Там тогда размытие при масштабе получается типа эффекта blur, а не квадратики. (как называется - не знаю)

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

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

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

Теги
scale , Shader
Опции темы
Опции просмотра

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

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


 


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


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