Эмуляция вложенного цикла в Pixel Bender для Flash / Flex

У меня есть два вектора большого, но произвольного (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?


person Kizaru    schedule 22.07.2011    source источник
comment
Я не совсем понимаю ваш вопрос, но похоже, что вы легко справитесь с этим с помощью Pixel Bender.   -  person AturSams    schedule 21.01.2014


Ответы (2)


Циклы и вложенные циклы (кроме встроенных) запрещены в программе Pixel Bender for Flash.

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

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

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

ИЗМЕНИТЬ

Вот ссылки, которые являются официальными документами 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.

person Community    schedule 23.07.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

person Community    schedule 22.07.2011
comment
Я обновил свой исходный вопрос примером того, что я хочу. Или это как-то так, но я этого просто не вижу? Если каждое изображение имеет размер 4x4, метод AssessmentPixel будет вызываться только 16 раз, верно? Если да, то это только один проход через каждое изображение одновременно, а это не то, что я хочу. - person Kizaru; 23.07.2011
comment
К сожалению, это все, что вы можете сделать. Смотрите мой новый ответ. Вы можете получить доступ к другим пикселям напрямую, изменив координаты выборки, но вы не можете построить цикл самостоятельно. - person ; 23.07.2011