• 妙用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;
        }
    }
  • 相关阅读:
    团队博客-十日冲刺6
    04构建之法阅读笔记之一
    Java基础-面向对象三大特性
    剑指 Offer 38. 字符串的排列
    Java基础:包装类 装箱/拆箱 Integer
    剑指 Offer 34. 二叉树中和为某一值的路径
    LeetCode 树:105. 从前序与中序遍历序列构造二叉树
    Java基础:类型
    Java基础:值传递和引用传递
    数据结构:图的基本知识
  • 原文地址:https://www.cnblogs.com/kenkofox/p/3784413.html
Copyright © 2020-2023  润新知