妙用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 条评论
登录 后参与评论

相关文章

来自专栏章鱼的慢慢技术路

Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间

在上一个教程中,我们在应用程序窗口的中心成功渲染了一个三角形。 我们没有太注意我们在顶点缓冲区中拾取的顶点位置。 在本教程中,我们将深入研究3D位置和转换的细节...

783
来自专栏贾志刚-OpenCV学堂

OpenCV中的图形绘制

OpenCV在Core模块中支持多种图形绘制与填充,方便开发者在图像对象识别与检测之后通过特定的图形轮廓加以显式表示。常见的几何形状包括线、矩形、圆形、椭圆,此...

3346
来自专栏章鱼的慢慢技术路

《算法图解》第八章_贪婪算法_集合覆盖问题

1836
来自专栏前端知识分享

第98天:CSS3中transform变换详解

Transform字面上就是变形,改变的意思。在CSS3中transform主要包括以下几种:旋转rotate、扭曲skew、缩放scale和移动transla...

613
来自专栏老马说编程

(34) 随机 / 计算机程序的思维逻辑

随机 本节,我们来讨论随机,随机是计算机程序中一个非常常见的需求,比如说: 各种游戏中有大量的随机,比如扑克游戏洗牌 微信抢红包,抢的红包金额是随机的 北京购...

2056
来自专栏存储

数据在内存中的存储

计算机要处理的信息是多种多样的,如数字、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形...

1756
来自专栏人工智能LeadAI

tensorflow的数据输入

tensorflow有两种数据输入方法,比较简单的一种是使用feed_dict,这种方法在画graph的时候使用placeholder来站位,在真正run的时候...

1155
来自专栏吉浦迅科技

DAY 60:阅读SIMD Video Instructions

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第60天,我们正在讲解CUDA C语法,希望在接下来的40天里,您可以学...

621
来自专栏机器之心

业界 | 谷歌开源DeepLearn.js:可实现硬件加速的机器学习JavaScript库

选自GitHub 机器之心编译 参与:蒋思源、路雪 deeplearn.js 是一个可用于机器智能并加速 WebGL 的开源 JavaScript 库。de...

3438
来自专栏wOw的Android小站

[Tensorflow] 在Android运行TensorFlow模型

以下代码来自于TensorFlowObjectDetectionAPIModel.java

2271

扫码关注云+社区