package { import flare.basic.*; import flare.core.*; import flare.flsl.*; import flash.display.*; import flash.events.*; import flash.geom.*; /** * @author Ariel Nehmad */ public class Test63_MotionBlur extends Sprite { [Embed(source = "../bin/blurQuad.flsl.compiled", mimeType = "application/octet-stream")] private var Blur:Class; private var scene:Scene3D; private var blur:FLSLMaterial; private var bufferA:Texture3D; private var bufferB:Texture3D; private var bufferCount:int; public function Test63_MotionBlur() { scene = new Viewer3D( this, null, 0.25 ); scene.autoResize = true; scene.addEventListener( Scene3D.RENDER_EVENT, renderEvent ); scene.addChildFromFile( "planet.zf3d" ); blur = new FLSLMaterial( "blur", new Blur ); bufferA = new Texture3D( new Rectangle( 0, 0, 1024, 512 ) ); bufferA.upload( scene ); bufferB = new Texture3D( new Rectangle( 0, 0, 1024, 512 ) ); bufferB.upload( scene ); } private function renderEvent(e:Event):void { e.preventDefault(); var front:Texture3D; var back:Texture3D; if ( bufferCount++ % 2 == 0 ) { front = bufferA; back = bufferB; } else { front = bufferB; back = bufferA; } scene.context.setRenderToTexture( front.texture, true ); scene.context.clear( 0.2, 0.3, 0.4 ); scene.render(); blur.params.texture.value = back; blur.params.alpha.value[0] = 0.8; // <-- higer values results in more blur (0 to 1) scene.drawQuadTexture( null, 0, 0, stage.stageWidth, stage.stageHeight, blur ); blur.params.texture.value = front; blur.params.alpha.value[0] = 1; scene.context.setRenderToBackBuffer(); scene.drawQuadTexture( null, 0, 0, stage.stageWidth, stage.stageHeight, blur ); } } }