flashplayer10以后开始支持硬件加速,目前支持openGL2.0。下面是一个实例,先贴上代码。
/**
tb
*/
package
{
import flash.display.Loader;
import flash.display.BitmapData;
import flash.display.Shader;
import flash.display.Shape;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.net.URLRequest;
import flash.net.URLStream;
import flash.utils.ByteArray;
import flash.utils.Timer;
import flash.utils.getTimer;
public class TestShader extends Sprite
{
private var _shape:Shape=new Shape();
private var _bitmapData:BitmapData;
private var _shader:Shader = new Shader();
private var _sl:URLStream=new URLStream();
public function TestShader()
{
this.stage.scaleMode=StageScaleMode.NO_SCALE;
this.stage.align=StageAlign.TOP_LEFT;
this.stage.showDefaultContextMenu=false;
//===========================================
//加载图片
var imgloader:Loader=new Loader();
imgloader.contentLoaderInfo.addEventListener(Event.COMPLETE,imgComplete);
imgloader.load(new URLRequest("image.jpg"));
}
/**
* 加载图片完成
* @param event
*
*/
private function imgComplete(event:Event):void
{
_bitmapData=event.target.content.bitmapData;
_sl.addEventListener(Event.COMPLETE,shaderLoaded);
_sl.load(new URLRequest("Crystallize.pbj"));
}
/**
* 加载pbj文件完成
* @param event
*
*/
private function shaderLoaded(event:Event):void
{
var sls:URLStream= event.target as URLStream;
if(sls==null){
throw new Error("GLSL data is empty or load error");
}
var byArr:ByteArray=new ByteArray();
sls.readBytes(byArr);
//开始着色渲染
_shader.byteCode = byArr;
_shader.data.src.input = _bitmapData;
//添加显示
_shape.x=20;
_shape.y=20;
this.addChild(_shape);
//时间间隔
var time:Timer=new Timer(100);
time.addEventListener(TimerEvent.TIMER,onTime);
time.start();
}
/**
* 时间间隔,动态改变着色渲染
* @param event
*
*/
private function onTime(event:TimerEvent):void
{
_shader.data.size.value = [Math.sin(event.target.currentCount/100)*50];
_shape.graphics.clear();
_shape.graphics.beginShaderFill(_shader);
_shape.graphics.drawRect(0,0,200,200);
}
}
}