Эмуляция вложенного цикла в Pixel Bender для Flash / Flex - PullRequest
1 голос
/ 23 июля 2011

У меня есть два вектора большого, но произвольного (длина v1.length не обязательно равна длине v2.length), и я хочу попарно умножить их.Поскольку это основное узкое место в большом цикле кода AS3, я подумал, что постараюсь вытащить код и запустить его асинхронно через Pixel Bender.Теперь для представления данных у меня будет две переменные image2 в качестве входных данных.

Как получить пиксель с одного изображения и выполнить расчеты с каждым пикселем другого изображения?Я только изучаю Pixel Bender, так что, возможно, я упустил некоторую работу по зацикливанию.

РЕДАКТИРОВАТЬ: Возможно, мне нужно уточнить.Допустим, у меня есть что-то вроде этого

var v1:Vector.<Point> = ...;
var v2:Vector.<Point> = ...;
var result:Vector.<Point> = ...;
for (var i:int = 0; i < v1.length; ++i)
    for (var j:int = 0; j < v2.length; ++j)
        result[i] += v1[i] * v2[j];

Это вложенный цикл - как я могу эмулировать его в Pixel Bender?

Ответы [ 2 ]

1 голос
/ 23 июля 2011

Петли и вложенные петли (кроме встроенных) запрещены в пиксель-бендере для вспышки.

http://forums.adobe.com/thread/840318

http://blog.leeburrows.com/2011/02/pixelbender-filters-3/

Полагаю, исключением является pixelbender 3D, который находится в бета-версии и предназначен для использования с API-интерфейсом кротовины.

EDIT

Вот ссылки, являющиеся официальными документами Adobe, которые явно подтверждают вышесказанное:

http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/pixelbender/pdfs/pixelbender_guide.pdf

со страницы 17:

Pixel Bender во Flash Player не поддерживает: -> циклы или управляющие структуры, отличные от if и else.

Это было для меня настоящим обломом, когда я узнал сам, и я думаю, что это серьезная ошибка со стороны Adobe.

1 голос
/ 23 июля 2011

Основная функция в ядре пиксель-бендера представляет собой цикл и вызывается обратно для каждого пикселя, оцениваемого ядром. Вот ссылка на учебник о том, как делать то, что вы хотите (работа с несколькими входами).

http://www.adobe.com/devnet/pixelbender/articles/creating_effects_pt09.html#articlecontentAdobe_numberedheader

По сути, все сводится к определению двух входных данных:

<languageVersion : 1.0;>

kernel blendy
<   namespace : "com.adobe.devnet.pixelbender";
    vendor : "Kevin's Filters";
    version : 1;
    description : "mashes two inputs together";
> 
{
    input image4 src;  //Input image 1 as image4 (RGBA)
    input image4 src2; //Input image 2 as image4 (RGBA)
    output pixel4 dst; //Single pixel data type/represents single pixel value (RGBA)

    void evaluatePixel()
    {
       dst = sampleNearest(src,outCoord());
    }
}

Обратите внимание, что двумя параметрами sampleNearest являются исходное изображение и координаты пикселя для выборки. outCoord () Я считаю, что это просто текущий пиксель в цикле. Как уже упоминалось, evaludatePixel (в моем понимании) вызывается один раз на пиксель, который существует на входе. Вот модифицированная версия приведенного выше кода (по ссылке), которая считывает значение обоих входов одновременно:

<languageVersion : 1.0;>

kernel blendy
<   namespace : "com.adobe.devnet.pixelbender";
    vendor : "Kevin's Filters";
    version : 1;
    description : "mashes two inputs together";
> 
{
    input image4 src;  //Input image 1 as image4 (RGBA)
    input image4 src2; //Input image 2 as image4 (RGBA)
    output pixel4 dst; //Output image

    void evaluatePixel()
    {
       dst = sampleNearest(src2,outCoord()) + sampleNearest(src, outCoord());
    }
}

Вот два видеоурока, который расскажет намного больше о том, как пиксель работает в длину:

http://gotoandlearn.com/play.php?id=83

http://gotoandlearn.com/play.php?id=84

http://www.gotoandlearn.com/play.php?id=95

...