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

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

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

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Question BitmapData.draw() with BlendMode.SHADER

Всем привет.
Есть шейдер, который реализует эффект засветки области (а-ля лампочка, свет от костра). Пока я его использую, применяя к одному из спрайтов, как blendShader = myShader, все работает отлично. Но беда в том, что мне нужно иметь возможность вывести такой спрайт на битмап дату методом draw(). Этот метод поддерживает выбор типа смешивания BlendMode, однако работают только "родные" типы смешивания. При попытке указать тип смешивания BlendMode.SHADER - ничего не происходит, изображение рисуется, как будто никакого шейдера и нет.

Код AS3:
var back:Bitmap = new Input1(); // Embed-картинка
var fore:Bitmap = new Input2(); // Embed-картинка
 
var shader:Shader = new Shader(new ShaderClass());
 
fore.blendShader = shader; // применяем шейдер к "верхнему" спрайту
 
var dest:BitmapData = new BitmapData(1024, 600, true, 0x000000);
dest.draw(back); 
dest.draw(fore, fore.transform.matrix, fore.transform.colorTransform, BlendMode.SHADER); // изображение выводиться, но без шейдера
 
addChild(new Bitmap(dest));
Кто либо сталкивался с подобной задачей?
Спасибо.

Старый 19.11.2010, 15:03
cleptoman вне форума Посмотреть профиль Отправить личное сообщение для cleptoman Найти все сообщения от cleptoman
  № 2  
Ответить с цитированием
cleptoman
 
Аватар для cleptoman

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
а рисовать весь контейнер с этим безобразием пробовали?
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 19.11.2010, 15:35
Lecosson вне форума Посмотреть профиль Отправить личное сообщение для Lecosson Найти все сообщения от Lecosson
  № 3  
Ответить с цитированием
Lecosson

Регистрация: Apr 2008
Сообщений: 80
Записей в блоге: 3
Код AS3:
var shader:Shader = new Shader(new ShaderClass());
fore.blendShader = shader; // указываем шейдер для "верхнего" спрайту
fore.blendMode = BlendMode.SHADER; // указываем режим смешивания
Кстати, шейдер точно рабочий? Я с таким на сутки застрял, потом оказалось, что выход подал источник вместо вычисляемого значения.


Последний раз редактировалось Lecosson; 19.11.2010 в 15:37.
Старый 19.11.2010, 15:57
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 4  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Весь контейнер с этим безобразием мне рисовать не нужно, мне нужно лишь вывести объекты, которые засветят определенные области.
Шейдер работает, проверял на спрайтах, все блендиться отлично. Но как только пытаюсь использовать метод draw() - никакого результата.

Код AS3:
fore.blendShader = shader; // указываем шейдер для "верхнего" спрайту
fore.blendMode = BlendMode.SHADER; // это указывать уже не обязательно, т.к. после присвоения blendShader свойство blendMode и так станет BlendMode.SHADE

Старый 22.11.2010, 15:36
Lecosson вне форума Посмотреть профиль Отправить личное сообщение для Lecosson Найти все сообщения от Lecosson
  № 5  
Ответить с цитированием
Lecosson

Регистрация: Apr 2008
Сообщений: 80
Записей в блоге: 3
А у вас часом в шейдере outCoords() не используется? При расчетах в blendmode это всегда ноль-ноль.

Старый 24.11.2010, 04:27
chabapok вне форума Посмотреть профиль Отправить личное сообщение для chabapok Найти все сообщения от chabapok
  № 6  
Ответить с цитированием
chabapok

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
А что такое вообще outCoords()? В шейдерах есть outCoord(), без буквы s вконце.
не знаю как он в blendMode работает, но подозреваю что должен нормально - ведь как же без него-то обойтись, ведь нужен же цикл по координатам в любом случае.

по делу -- есть гипотеза, что colorTransform - это сам по себе уже своего рода шейдер. Попробуйте указать null вместо него. вряд ли конечно заработает, но вдруг?

и еще такой вопрос. Вы написали, что у вас шейдер а-ля лампочка. Для подобного шейдера на входе нужна только 1 картинка. А blendMode все же используется для наложения одной картинки на другую, и если я ничего не путаю, ему нужно 2 картинки на входе. Так сколько ж картинок на входе у вашего шейдера? И если 2, то зачем для лампочки 2 картинки?

Старый 24.11.2010, 15:26
Lecosson вне форума Посмотреть профиль Отправить личное сообщение для Lecosson Найти все сообщения от Lecosson
  № 7  
Ответить с цитированием
Lecosson

Регистрация: Apr 2008
Сообщений: 80
Записей в блоге: 3
Тогда понятно. Шейдер используемый как режим смешивания - это единственный случай, когда outCoord() /*это расположение обрабатываемой точки*/ не учитывается, всегда равен нулю, т.е. в этом случае шейдер пригоден только для цветовых трансформаций, одинаковых по всей картинке. У вас в шейдере он будет использоваться (скорее всего) для вычисления расстояния от точки до источника цвета.
Т.е. как blendMode работать корректно он не будет.

Старый 24.11.2010, 20:58
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 8  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Не, моя лампочка намного проще . На входе мне нужно именно два изображения: бэк, который я видоизменяю, и изображение цветового пятна, которое используется в качестве значения для расчета, насколько же сильно мне нужно засветить/затемнить фоновое изображение... это выглядит, как будто вы светите фонариком на землю... при чем благодаря второму изображению я меняю не только интенсивность, но и цвет фонаря.
Пиксель в шейдере я беру так:
Код AS3:
pixel4 bg = sampleNearest(back, outCoord());
Собственно шейдер работает, и работает именно так, как мне нужно. Беда лишь в том, что для его использования я не могу использовать метод BitmapData.draw(), я могу только наложить один спрайт поверх другого. Такой вариант я уже реализовал... но он не очень мне удобен.

Старый 25.11.2010, 11:16
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 9  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Цитата:
Сообщение от cleptoman Посмотреть сообщение
а рисовать весь контейнер с этим безобразием пробовали?
Немного перефразирую, если положить все в отдельный контейнер, и отрисовать его?

Старый 25.11.2010, 12:12
litebox вне форума Посмотреть профиль Отправить личное сообщение для litebox Найти все сообщения от litebox
  № 10  
Ответить с цитированием
litebox
 
Аватар для litebox

Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
Ага, я понял Вас, не знаю, не пробовал - мне такой вариант ни чем не лучше. Пока работает с двумя спрайтами, и на том спасибо

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

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

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


 


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


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