11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 3648|回复: 5
上一主题 下一主题

[Stage3D] [转]Stage3d AGAL GPU处理照片 旧照片效果 sepia pixelbender

[复制链接] TA的其它主题
发表于 2017-11-14 10:20:58 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 TKCB 于 2017-11-14 23:41 编辑

原贴地址:
http://www.lxway.com/8401601.htm


如果看不到下边的flash,请更新flash player到最新版本。

利用AGAL实现旧照片效果,大家可以对照一下之前一篇文章,关于图像处理(pixelbender)。硬件处理肯定会更快,但这里无法表现出来,毕竟图片就这么小。拖拉进度条,可以设置照片旧的程度。



  1. package
  2. {
  3.     import com.adobe.utils.AGALMiniAssembler;
  4.     import com.bit101.components.HSlider;
  5.     import com.bit101.components.PushButton;
  6.    
  7.     import flash.display.Bitmap;
  8.     import flash.display.BitmapData;
  9.     import flash.display.Loader;
  10.     import flash.display.Sprite;
  11.     import flash.display.Stage3D;
  12.     import flash.display.StageAlign;
  13.     import flash.display.StageScaleMode;
  14.     import flash.display3D.Context3D;
  15.     import flash.display3D.IndexBuffer3D;
  16.     import flash.display3D.Program3D;
  17.     import flash.display3D.VertexBuffer3D;
  18.     import flash.display3D.textures.Texture;
  19.     import flash.events.Event;
  20.     import flash.geom.Matrix;
  21.     import flash.geom.Matrix3D;
  22.     import flash.net.FileFilter;
  23.     import flash.net.FileReference;
  24.     import flash.utils.ByteArray;
  25.    
  26.     import net.hires.debug.Stats;
  27.    
  28.     /**
  29.      * 借用了boycy815的代码框架
  30.      * @author kenkozheng
  31.      */
  32.     [SWF(frameRate="60")]
  33.     public class AGAL_Filter extends Sprite
  34.     {
  35.         private const WIDTH:Number = 512;
  36.         private const HEIGHT:Number = 512;
  37.         
  38.         //stage3d五巨头
  39.         private var _stage3d:Stage3D;
  40.         private var _context3d:Context3D;
  41.         private var _program3d:Program3D;
  42.         private var _index:IndexBuffer3D;
  43.         private var _vertex:VertexBuffer3D;
  44.         private var _texture:Texture;
  45.         
  46.         [Embed(source=("4.jpg"))]
  47.         private var ImageSource:Class;
  48.         
  49.         private var _vertexProgram:String = "mov op, va0\n" +
  50.                                         "mov v0, va1";            //传递给片段shader坐标值
  51.         
  52.         private var _fragmentProgram:String = "tex ft1, v0, fs0<2d,linear,nomip>\n" +
  53.                                             "m44 ft2, ft1, fc1\n" +            //颜色变换
  54.                                             "mul ft2, ft2, fc0.x\n" +        //效果图跟原图做multiply,向量float4 * float = float4,类似PixelBender
  55.                                             "mul ft1, ft1, fc0.y\n" +
  56.                                             "add ft2, ft2, ft1\n" +
  57.                                             "mov oc, ft2";
  58.         
  59.         public function AGAL_Filter():void
  60.         {
  61.             if (stage) init();
  62.             else addEventListener(Event.ADDED_TO_STAGE, init);
  63.         }
  64.         
  65.         private function init(e:Event = null):void
  66.         {
  67.             stage.scaleMode = StageScaleMode.NO_SCALE;
  68.             stage.align = StageAlign.TOP_LEFT;
  69.             removeEventListener(Event.ADDED_TO_STAGE, init);
  70.             _stage3d = stage.stage3Ds[0];
  71.             _stage3d.addEventListener(Event.CONTEXT3D_CREATE, onCreate);
  72.             _stage3d.requestContext3D();
  73.             addChild(new Stats());
  74.         }
  75.         
  76.         private function onCreate(e:Event):void
  77.         {
  78.             e.target.removeEventListener(Event.CONTEXT3D_CREATE, onCreate);
  79.             
  80.             _context3d = _stage3d.context3D;
  81.             _context3d.enableErrorChecking = true;
  82.             
  83.             var agal:AGALMiniAssembler = new AGALMiniAssembler();
  84.             
  85.             var vp:ByteArray = agal.assemble("vertex", _vertexProgram);
  86.             var fp:ByteArray = agal.assemble("fragment", _fragmentProgram);
  87.             _program3d = _context3d.createProgram();
  88.             _program3d.upload(vp, fp);
  89.             _context3d.setProgram(_program3d);
  90.             
  91.             _context3d.configureBackBuffer(WIDTH, HEIGHT, 0, false);
  92.             _context3d.setBlendFactors("one", "zero");
  93.             _context3d.setCulling("back");
  94.             
  95.             //两个三角形拼成平面
  96.             _index = _context3d.createIndexBuffer(6);
  97.             _index.uploadFromVector(new<uint>[0, 1, 2, 0, 2, 3], 0, 6);
  98.             
  99.             _vertex = _context3d.createVertexBuffer(4, 4);
  100.             //这是由于纹理的坐标原点是,y轴向下,最大值为1最小值为0
  101.             //而顶点的坐标原点则是在舞台中央,而且y轴向上,最大值为1最小值为-1
  102.             //那么(-1,-1)点对应的纹理就是(0,1)
  103.             _vertex.uploadFromVector(new<Number>[
  104.                 //x, y, u, v
  105.                 -1, -1, 0, 1,
  106.                 -1, 1, 0, 0,
  107.                 1, 1, 1, 0,
  108.                 1, -1, 1, 1], 0, 4);
  109.             _context3d.setVertexBufferAt(0, _vertex, 0, "float2"); //xy坐标
  110.             _context3d.setVertexBufferAt(1, _vertex, 2, "float2");    //uv坐标
  111.             
  112.             //纹理位图
  113.             var bt:Bitmap = Bitmap(new ImageSource());
  114.             var btmap:BitmapData = new BitmapData(WIDTH, HEIGHT);
  115.             btmap.draw(bt);
  116.             
  117.             //上传纹理
  118.             _texture = _context3d.createTexture(btmap.width, btmap.height, "bgra", false);
  119.             _texture.uploadFromBitmapData(btmap);
  120.             _context3d.setTextureAt(0, _texture);
  121.             //multiple比例
  122.             _context3d.setProgramConstantsFromVector("fragment", 0, new<Number>[1, 0, 0, 0]);
  123.             //颜色矩阵
  124.             _context3d.setProgramConstantsFromMatrix("fragment", 1, new Matrix3D(new <Number>[
  125.                 0.393, 0.768, 0.189, 0,
  126.                 0.349, 0.686, 0.168, 0,
  127.                 0.272, 0.534, 0.13, 0,
  128.                 0, 0, 0, 1
  129.             ]));
  130.             
  131.             _context3d.clear(0, 0, 0, 0);
  132.             _context3d.drawTriangles(_index);
  133.             _context3d.present();
  134.             
  135.             start();
  136.         }
  137.         
  138.         private function start():void
  139.         {
  140.             new PushButton(this, 282, 515, "change", onUpload);
  141.             new HSlider(this, 392, 520, onBar).setSliderParams(0, 1, 1);
  142.         }
  143.         
  144.         private function onBar(e:Event):void
  145.         {
  146.             var v:Number = e.currentTarget.value;
  147.             _context3d.setProgramConstantsFromVector("fragment", 0, new<Number>[v, 1-v, 0, 0]);
  148.             _context3d.clear(0, 0, 0, 0);
  149.             _context3d.drawTriangles(_index);
  150.             _context3d.present();
  151.         }
  152.         
  153.         private function onUpload(e:Event):void
  154.         {
  155.             var fr:FileReference = new FileReference();
  156.             fr.addEventListener(Event.SELECT, onSelect);
  157.             fr.browse([new FileFilter("jpg/png", "*.jpg;*.png")]);
  158.         }
  159.         
  160.         private function onSelect(e:Event):void
  161.         {
  162.             e.currentTarget.removeEventListener(Event.SELECT, onSelect);
  163.             e.currentTarget.addEventListener(Event.COMPLETE, onComplete);
  164.             e.currentTarget.addEventListener(Event.OPEN, function(e:Event):void { } );
  165.             e.currentTarget.load();
  166.         }
  167.         
  168.         private function onComplete(e:Event):void
  169.         {
  170.             e.currentTarget.removeEventListener(Event.COMPLETE, onComplete);
  171.             var loader:Loader = new Loader();
  172.             loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderOnComplete);
  173.             loader.loadBytes(e.currentTarget.data);
  174.         }
  175.         
  176.         private function loaderOnComplete(e:Event):void
  177.         {
  178.             e.currentTarget.removeEventListener(Event.COMPLETE, loaderOnComplete);
  179.             
  180.             var btmap:BitmapData = new BitmapData(WIDTH, HEIGHT);
  181.             var scale:Number = Math.max(WIDTH/e.currentTarget.loader.width, HEIGHT/e.currentTarget.loader.height);
  182.             btmap.draw(e.currentTarget.loader, new Matrix(scale, 0, 0, scale), null, null, null, true);
  183.             
  184.             _texture.uploadFromBitmapData(btmap);
  185.             
  186.             _context3d.clear(0, 0, 0, 0);
  187.             _context3d.drawTriangles(_index);
  188.             _context3d.present();
  189.         }
  190.     }
  191.    
  192. }
复制代码
发表于 2017-11-14 11:09:15 | 显示全部楼层
有一个外部类,你没有上传
回复

使用道具 举报

 楼主| 发表于 2017-11-14 11:31:04 | 显示全部楼层
TKCB 发表于 2017-11-14 11:09
有一个外部类,你没有上传

用到的类库:lol


  • com.bit101.components.HSlider
  • com.bit101.components.PushButton;

com.bit101
com.bit101.7z (34.15 KB, 下载次数: 2)
回复

使用道具 举报

发表于 2017-11-20 14:24:19 | 显示全部楼层
楼主不能打包一个附件上传一下嘛?
回复

使用道具 举报

发表于 2020-6-23 10:25:20 | 显示全部楼层
学习了 !!!
回复

使用道具 举报

发表于 2024-11-7 14:08:34 | 显示全部楼层
标记一下 下次来下载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表