Uso de un sombrado como filtro

Flash Player 10 y posterior, Adobe AIR 1.5 y posterior

La utilización de un sombreado como filtro es similar al uso de cualquier otro filtro en ActionScript. Cuando se usa un sombreado como filtro, la imagen filtrada (un objeto de visualización u objeto BitmapData) se transmite al sombreado. El sombreado utiliza la imagen de entrada para crear la salida del filtro, que suele ser una versión modificada de la imagen original. Si el objeto filtrado es un objeto de visualización, la salida del sombreado se muestra en pantalla en lugar del objeto de visualización filtrado. Si el objeto filtrado es un objeto BitmapData, la salida del sombreado se convierte en el contenido del objeto BitmapData cuyo método applyFilter() se llama.

Para utilizar un sombreado como filtro, en primer lugar cree el objeto Shader tal y como se describe en Carga e incorporación de un sombreado . A continuación, cree un objeto ShaderFilter vinculado al objeto Shader. El objeto ShaderFilter es el filtro que se aplica al objeto filtrado. Se aplica a un objeto del mismo modo que se aplica cualquier filtro. Se transmite a la propiedad filters de un objeto de visualización o se llama al método applyFilter() en un objeto BitmapData. Por ejemplo, el siguiente código crea un objeto ShaderFilter y aplica el filtro a un objeto de visualización denominado homeButton .

var myFilter:ShaderFilter = new ShaderFilter(myShader); 
homeButton.filters = [myFilter];

Si se utiliza una sombreado como filtro, el sombreado se debe definir con una entrada como mínimo. Tal y como muestra el ejemplo, en el código no se establece el valor de entrada. Sin embargo, el objeto de visualización filtrado u objeto BitmapData se define como imagen de entrada. Si se emplea un sombreado que espera varias entradas, indique un valor para todas las entradas que no sean la primera.

En algunos casos, un filtro cambia las dimensiones de la imagen original. Por ejemplo, un efecto típico de sombra paralela añade píxeles adicionales que contienen la sombra que se agrega a la imagen. Si se utiliza un sombreado que cambia las dimensiones de la imagen, establezca las propiedades leftExtension , rightExtension , topExtension y bottomExtension para indicar el grado de cambio de tamaño deseado de la imagen.

El siguiente ejemplo muestra el uso de un sombreado como filtro. El filtro de este ejemplo invierte los valores del canal rojo, verde y azul de una imagen. El resultado en la versión “negativa” de la imagen.

Nota: el sombreado que utiliza este ejemplo es el núcleo de Pixel Bender invertRGB.pbk que se incluye en el kit de herramientas del lenguaje. Puede cargar el código fuente para el núcleo desde el directorio de instalación del kit de herramientas de Pixel Bender. Compile el código fuente y guarde el archivo de código de bytes en el mismo directorio que el código fuente.

El código de ActionScript importante se encuentra en estos dos métodos:

  • init() : el método init() se llama cuando se carga la aplicación. En este método el código carga el archivo de código de bytes de sombreado.

  • onLoadComplete() : en el método onLoadComplete() el código crea el objeto Shader denominado shader . Crea y dibuja el contenido de un objeto denominado target . El objeto target es un rectángulo relleno con un color de degradado lineal que es rojo en la parte izquierda, amarillo-verde en el centro y azul claro en la parte derecha. El objeto no filtrado presenta el siguiente aspecto:

    Cuando se aplica el filtro los colores se invierten y el rectángulo presenta el siguiente aspecto:

El sombreado que utiliza este ejemplo es el núcleo de Pixel Bender de ejemplo “invertRGB.pbk”, incluido en el kit de herramientas del lenguaje. El código fuente está disponible en el archivo “invertRGB.pbk” en el directorio de instalación del kit de herramientas de Pixel Bender. Compile el código fuente y guarde el archivo de código de bytes con el nombre “invertRGB.pbj” en el mismo directorio que el código fuente de ActionScript.

Este es el código de ActionScript de este ejemplo. Utilice esta clase como clase principal de aplicación para un proyecto solo ActionScript en Flex, o bien, como la clase de documento para el archivo FLA en Flash Professional:

package 
{ 
    import flash.display.GradientType; 
    import flash.display.Graphics; 
    import flash.display.Shader; 
    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.filters.ShaderFilter; 
    import flash.events.Event; 
    import flash.geom.Matrix; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.URLRequest; 
     
    public class InvertRGB extends Sprite 
    { 
        private var shader:Shader; 
        private var loader:URLLoader; 
         
        public function InvertRGB() 
        { 
            init(); 
        } 
         
        private function init():void 
        { 
            loader = new URLLoader(); 
            loader.dataFormat = URLLoaderDataFormat.BINARY; 
            loader.addEventListener(Event.COMPLETE, onLoadComplete); 
            loader.load(new URLRequest("invertRGB.pbj")); 
        } 
         
         
        private function onLoadComplete(event:Event):void 
        { 
            shader = new Shader(loader.data); 
             
            var target:Shape = new Shape(); 
            addChild(target); 
             
            var g:Graphics = target.graphics; 
            var c:Array = [0x990000, 0x445500, 0x007799]; 
            var a:Array = [255, 255, 255]; 
            var r:Array = [0, 127, 255]; 
            var m:Matrix = new Matrix(); 
            m.createGradientBox(w, h); 
            g.beginGradientFill(GradientType.LINEAR, c, a, r, m); 
            g.drawRect(10, 10, w, h); 
            g.endFill(); 
             
            var invertFilter:ShaderFilter = new ShaderFilter(shader); 
            target.filters = [invertFilter]; 
        } 
    } 
}

Para obtener más información sobre la aplicación de filtros, consulte Creación y aplicación de filtros .