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

Вернуться   Форум Flasher.ru > Flash > Pixel Bender/AGAL

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

Регистрация: Jul 2011
Сообщений: 32
По умолчанию Шейдер во Flash'е и Pixel Bender'e ведет себя по разному

Рисую в BitmapData с нулевой альфой. Заполняющие пикселя имеют альфу = 1 и не касаются границ BitmapDatы. Границы, полученного рисунка надо разгладить (т.е. только пиксели, имеющие в соседях альфу = 0).
Набросал такой шейдер:
Код:
>

{
    input image4 src;
    output pixel4 dst;



    void
    evaluatePixel()

    {
        dst = sampleNearest(src,outCoord());
        if(dst.a > 0.0){
            float2 s = outCoord();
            pixel4 p0 = sampleNearest(src, float2(s.x, s.y - 1.0));
            pixel4 p1 = sampleNearest(src, float2(s.x - 1.0, s.y));
            pixel4 p2 = sampleNearest(src, float2(s.x - 1.0, s.y - 1.0));
            pixel4 p3 = sampleNearest(src, float2(s.x - 1.0, s.y + 1.0));
            if(!all(bool4(int(p0.a), int(p1.a), int(p2.a), int(p3.a)))) {
                p2 = sampleNearest(src, float2(s.x, s.y + 1.0));
                p3 = sampleNearest(src, float2(s.x + 1.0, s.y));
                dst.rgb = (dst.rgb + p0.rgb + p1.rgb + p2.rgb + p3.rgb) / 5.0;
               dst.a = dst.a;
            } else {
                p2 = sampleNearest(src, float2(s.x, s.y + 1.0));
                p3 = sampleNearest(src, float2(s.x + 1.0, s.y));
                pixel4 p4 = sampleNearest(src, float2(s.x + 1.0, s.y - 1.0));
                pixel4 p5 = sampleNearest(src, float2(s.x + 1.0, s.y + 1.0));
                if(!all(bool4(int(p2.a), int(p3.a), int(p4.a), int(p5.a)))) {
                    dst.rgb = (dst.rgb + p0.rgb + p1.rgb + p2.rgb + p3.rgb) / 5.0;
                    dst.a = dst.a;
                }
            }
        } 
    }
}
В AS3 вставляю так:
Код AS3:
[Embed(source = "courveedge.pbj", mimeType = "application/octet-stream")] 
 var AaEdge:Class; 
 var shader:Shader = new Shader(); 
 shader.byteCode =  new AaEdge();
 var shaderFilter:ShaderFilter = new ShaderFilter( shader );
 bmd.applyFilter(bmd, new Rectangle(0, 0, bmd.width, bmd.height), new Point(), shaderFilter);
 var bmp:Bitmap = new Bitmap(bmd);
В IDE Pixel Bender'а шейдер работает так, как от него ожидалось, фильтр, примененный к BitmapDatа, размазывает весь рисунок, а не только края, хотя внутри тела рисунка ни один пиксел не имеет нулевую альфу.
Если кому очевидно, в чем проблема, плз, поясните и мне.

Старый 21.12.2011, 21:57
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 2  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
А если так:
Код:
<languageVersion : 1.0;>

kernel NewFilter
<   namespace : "Your Namespace";
    vendor : "Your Vendor";
    version : 1;
    description : "your description";
>
{
    input image4 src;
    output pixel4 dst;

    void evaluatePixel()
    {
        dst = sampleNearest(src,outCoord());
        if(dst.a > 0.0){
            float2 s = outCoord();
            pixel4 p0 = sampleNearest(src, float2(s.x, s.y - 1.0));
            pixel4 p1 = sampleNearest(src, float2(s.x - 1.0, s.y));
            pixel4 p2 = sampleNearest(src, float2(s.x - 1.0, s.y - 1.0));
            pixel4 p3 = sampleNearest(src, float2(s.x - 1.0, s.y + 1.0));
            if((p0.a * p1.a * p2.a * p3.a) < 1.0) {
                p2 = sampleNearest(src, float2(s.x, s.y + 1.0));
                p3 = sampleNearest(src, float2(s.x + 1.0, s.y));
                dst.rgb = 0.2 * (dst.rgb + p0.rgb + p1.rgb + p2.rgb + p3.rgb);
            //  dst = float4(1.0, 0.0, 1.0, 1.0);
            } else {
                p2 = sampleNearest(src, float2(s.x, s.y + 1.0));
                p3 = sampleNearest(src, float2(s.x + 1.0, s.y));
                pixel4 p4 = sampleNearest(src, float2(s.x + 1.0, s.y - 1.0));
                pixel4 p5 = sampleNearest(src, float2(s.x + 1.0, s.y + 1.0));
                if((p2.a * p3.a * p4.a * p5.a) < 1.0) {
                    dst.rgb = 0.2 * (dst.rgb + p0.rgb + p1.rgb + p2.rgb + p3.rgb);
                //  dst = float4(0.0, 0.0, 0.0, 1.0);
                }
            }
        } 
    }
}

Старый 22.12.2011, 09:46
Gantenbain вне форума Посмотреть профиль Отправить личное сообщение для Gantenbain Найти все сообщения от Gantenbain
  № 3  
Ответить с цитированием
Gantenbain

Регистрация: Jul 2011
Сообщений: 32
Это работает. Я, правда, хотел более общий случай - с произвольной (не нулевой) альфой. Но в целом, смысл ясен - с булевой "all" надо расстаться. Спасибо!

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

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

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


 


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


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