妙用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;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

译文 | 与TensorFlow的第一次接触 第三章:聚类

前一章节中介绍的线性回归是一种监督学习算法,我们使用数据与输出值(标签)来建立模型拟合它们。但是我们并不总是有已经打标签的数据,却仍然想去分析它们。这种情况下,...

3836
来自专栏Java Web

最长公共子序列问题

问题描述: 求两个字符序列的公共最长子序列。 ---- 最长公共子串 在回到子序列问题之前,先来了解一下子串的问题。 例如,HISH和FISH两个字符序列的公...

3174
来自专栏小樱的经验随笔

MATLAB命令大全+注释小结

一、常用对象操作:除了一般windows窗口的常用功能键外。 1、!dir 可以查看当前工作目录的文件。   !dir& 可以在dos状态下查看。 2、who ...

3234
来自专栏PPV课数据科学社区

【学习】K近邻算法基础:KD树的操作

Kd-树概念 Kd-树其实是K-dimension tree的缩写,是对数据点在k维空间中划分的一种数据结构。其实,Kd-树是一种平衡二叉树。 举一示例: 假设...

2975
来自专栏前端儿

比较字母大小

任意给出两个英文字母,比较它们的大小,规定26个英文字母A,B,C.....Z依次从大到小。

560
来自专栏程序生活

TensorFlow入门:MNIST数据的单层逻辑回归代码单层回归代码输出结果

1794
来自专栏数说工作室

【SAS Says】扩展篇:IML(2)

上一篇“高级篇:IML(1)”发出来之后,有朋友反映东西东西太简单了,根本不能算“高级”。想想也是,暂时还没有介绍太复杂的SAS程序,于是决定将本篇定为“扩展篇...

2816
来自专栏Jack-Cui

第五天、百元买百鸡

中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买白鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买白鸡,问翁、母、雏各几何? C...

2020
来自专栏潇涧技术专栏

Problem: Longest Common Subsequence

最长公共子序列(LCS)是典型的动态规划问题,如果不理解动态规划请移步先看这篇动态规划的总结,否则本文中的代码实现会不理解的哟!

501
来自专栏小鹏的专栏

02 The TensorFlow Way(1)

The TensorFlow Way Introduction:          现在我们介绍了TensorFlow如何创建张量,使用变量和占位符,我们将介...

19410

扫码关注云+社区