妙用Pixel bender执行复杂运算/普通数据运算 传递Vector数组

最近发现pixel bender有两个特殊点:

1、Input Image4,不单单可以用BitmapData来初始化,也可以用Vector.<Number>初始化。

2、ShaderJob,可以使用Vector.<Number>接收pb的运算结果,同时,这个输出结果不限于[0-1]。结果会从上往下一行一行的把每个像素的各通道信息填入到Vector中

基于这两点,就可以发现,可以把复杂的数学运算交给pb。尤其是类似于图像这样二维的信息,例如3d建模中,水面波动的计算。

AS代码:


var width :int = 3;
var height:int = 3;
var vector:Vector.<Number> = new Vector.<Number>;
var counter:int = 1;

//利用vector作为input,需要从左上角到右下角,逐行逐行把每个像素的3通道信息,以3个Number形式表示
for (var i:int = 0; i < width; i++)
{
for (var j:int = 0; j < height; j++)
{
vector.push(counter, counter, counter);
counter++;
}
}

//目的是格式化输出,好看。。。
for (var k:int = 0; k < vector.length; k+=3* width)
{
var array:Array = new Array();
for (var i2:int = 0; i2 < width ; i2++)
{
array.push(vector[k+i2*3] + "," + vector[k+1+i2*3] + "," + vector[k+2+i2*3]);
}
trace(array.join(" "));
}

trace ("=====================");

var shader:Shader = new Shader( new PbjClass() as ByteArray );
shader.data.src.input = vector;
shader.data.src.width = width;//这里必须指定width和height,否则出错
shader.data.src.height = height;

var result:Vector.<Number> = new Vector.<Number>();
//这里必须指定width和height,否则出错
var job:ShaderJob = new ShaderJob(shader, result, width, height);
job.start(true);

//目的是格式化输出,好看。。。
for (var k:int = 0; k < result.length; k+=3* width)
{
var array:Array = new Array();
for (var i2:int = 0; i2 < width ; i2++)
{
array.push(result[k+i2*3] + "," + result[k+1+i2*3] + "," + result[k+2+i2*3]);
}
trace(array.join(" "));
}

输出结果:


1,1,1   2,2,2   3,3,3
4,4,4 5,5,5 6,6,6
7,7,7 8,8,8 9,9,9
=====================
1,1,1 1,1,1 2,2,2
4,4,4 4,4,4 5,5,5
7,7,7 7,7,7 8,8,8

 

Pixel bender代码:


<languageVersion : 1.0;>

kernel test
< namespace : "Your Namespace";
vendor : "Your Vendor";
version : 1;
>
{
input image3 src; //注意这里是3,不是4.如果是4的话,就会报错。着色器输入 src 没有足够的数据。因为as代码中初始化输入只是用了3元组
output pixel3 dst;

void
evaluatePixel()
{
float2 coord = outCoord();
pixel3 px = sampleNearest(src, coord + float2(-1.0, 0.0));
dst.x = px.x;
dst.y = px.y;
dst.z = px.z;
}
}

妙用Pixel bender执行复杂运算/普通数据运算 传递Vector数组,布布扣,bubuko.com

时间: 2024-11-05 17:57:58

妙用Pixel bender执行复杂运算/普通数据运算 传递Vector数组的相关文章

Flash pixel Bender学习笔记

pixel Bender是指用来创建,编译,测试和导出pixel shader,用于各种flash产品的一个IDE. Pixel Bender是Adobe推出的一个高性能的图像视频处理技术.它能跨平台地使用CPU, GPU来对图像和视频应用滤镜和效果,在不了解底层硬件的前提下,我们也可以利用它实现自己的图像处理算法,并良好地运行在各种不同CPU.GPU型号的机器上. 开发者可以使用Pixel Bender技术为After Effect, PhotoShop, Flash开发滤镜.Flash pl

学习 opencv---(10)形态学图像处理(2):开运算,闭运算,形态学梯度,顶帽,黒帽合辑

上篇文章中,我们重点了解了腐蚀和膨胀这两种最基本的形态学操作,而运用这两个基本操作,我们可以实现更高级的形态学变换. 所以,本文的主角是OpenCV中的morphologyEx函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算.形态学梯度."顶帽"."黑帽"等等. 第二件事,是浅墨想跟大家做一个关于OpenCV系列文章的书写内容和风格的思想汇报. 是这样的,浅墨发现最近几期写出来的文章有些偏离自己开始开这个专栏的最初的愿望--原理和概念部分占的

三木运算,三元运算

三木运算,三元运算 name = 值1 if 条件 else 值2 深拷贝浅拷贝 str创建一个值不能修改,如果修改在,创建一个 对于int和str 赋值,深拷贝,浅拷贝地址是不变的 对于dict,list,tup 浅拷贝仅拷贝最外层 深拷贝是除了最内层都拷贝 函数 动态参数 万能参数 *arges **kwarges 局部变量和全局变量 全局 大写 修改,global 局部 小写,仅在代码中执行

Python 第2周 - Python基础-模块\数据运算

内容 模块初识 数据运算 bytes数据类型 python数据类型 列表的使用 元组与购物车操作 购物车程序练习 字符串常用操作 字典的使用 三级菜单实例 本周作业-购物车优化 一.模块初识 Python 库分两种:标准库(不需要安装,直接导入就可以直接使用的库).第三方库(必须安装才能使用如django).注意:编写代码时,模块名字不要跟库名字相同.系统自带模块简单举例:  sys库: 1.打印系统环境变量 sys.path: 1 import sys 2 print ("sys.path&q

WORD表格数据运算技巧

我们经常会用WORD制作表格,有时表内的数据要运算的,WORD表格数据运算能力无法与EXCEL相比.但常见的乘除加减.相邻数据累加,将金额数字自动转成大写,WORD都能在表格内自动完成.下面以一个简单的例子抛砖引玉: ?     一.图1是进货合同的一张表,表中红色数字都是表内数据运算的结果,公式如图2所示. 图1 WORD表格数据运算案例 图2 WORD表格公式及显示格式 二.WORD表格公式案例分析 1.表中的单价是“机身”与“包鼠”之和,公式可以是{=SUM(LEFT)}. 操作方法:先将

使用异或运算对数据及文件进行加密处理,附软件及源码

前几天写了一篇文章是在C语言中使用异或运算交换两个任意类型变量,其基础为使用^交换两个整数的算法: a ^= b; b ^= a; a ^= b; 如果你看明白这个算法,就会发现这样的规律:一个数异或另一个数两次后,该数保持不变.即: c = a^b; c = c^b; c == a; 这一规律就是使用异或运算对数据及文件进行加密处理的基本原理. 那就先贴下加密算法的代码: bool XorEncrypt(void* bufPtr, unsigned int bufSize, const cha

python修行之路(三 模块初识及数据运算类型)

在python修行路上,果不其然的遇到了第一个困处,开始看不懂代码,开始出现理解苦难的现象,这是小白修行路上的正常现象.其实自己是很慌的,感觉很无助,能做的就是把自己学的慢慢记录下来,理一个自己的逻辑,尽量写清楚,写的通俗易懂,为与我类似的修行者做参考. 一.模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,使用时安装调用就好,现在先象征性的学习2个简单的. sys模块--sys pass功能#!/usr/bin/env python# -*- coding: utf-8

赋值运算,拷贝运算,运算符重载,函数调用入栈,寄存器

赋值运算与拷贝运算的区别 如果对象在申明之后进行赋值运算,我们称之为赋值运算.例如:class1 A("af"); class1 B;B=A;此时实际调用的类的缺省赋值函数B.operator=(A); 如果对象在申明的同时马上进行初始化操作,则称之为拷贝运算.例如: class1 A("af"); class1 B=A; 此时其实际调用的是B(A)这样的浅拷贝操作. C++与C#对象的内存分配方式的不同 在C++中,对象的实例在编译的时候,就需要为其分配内存大小,

位运算与乘除运算的对比实验

Java 的JDK中存在很多位运算的使用,其目的是为了让代码跑的更快一些,我们做一个实验,看看到底可以节省多少计算时间. 以下代码中,分别使用了乘除运算和位运算来进行了一亿次基础操作,并打印了所消耗的时间. /** * 比较乘除运算和位运算时间消耗上的差距 */ public class TestBitOpr { public static void main(String[] args){ int j = 10; long start = System.currentTimeMillis();