我有两个大的矢量,但任意(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中模拟它?
答案 0 :(得分:1)
像素弯曲内核中的主要功能是一个循环,并且被内核评估的每个像素调用回来。这是一个教程的链接,指导您如何准确地使用(使用多个输入)。
基本上,它只是定义了两个输入:
<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
答案 1 :(得分:1)
闪存中的像素弯曲器禁止循环和嵌套循环(除内置循环外)。
http://forums.adobe.com/thread/840318
http://blog.leeburrows.com/2011/02/pixelbender-filters-3/
我认为例外是pixelbender 3D,它处于测试版状态,旨在与molehill API一起使用。
修改强>
以下链接是官方Adobe文档,明确确认上述内容:
从第17页开始:
Flash Player中的Pixel Bender不支持: - &GT;除了if和else之外的循环或控制结构。
当我发现自己时,这对我来说是一个真正的无聊,我认为这是Adobe的一个重大失败。