Uso de um sombreador como filtro

Flash Player 10 e posterior, Adobe AIR 1.5 e posterior

Usar um sombreador como filtro é parecido com usar qualquer um dos outros filtros do ActionScript. Quando você utiliza um sombreador como filtro, a imagem filtrada (um objeto de exibição ou objeto BitmapData) é passada para ele. O sombreador usa a imagem de entrada para criar a saída do filtro, que geralmente é uma versão modificada da imagem original. Se o objeto filtrado é um objeto de exibição, a saída do sombreador é exibida na tela no lugar do objeto de exibição filtrado. Se o objeto filtrado é um objeto BitmapData, a saída do sombreador torna-se o conteúdo do objeto BitmapData cujo método applyFilter() é chamado.

Para usar um sombreador como filtro, primeiro você deve criar o objeto Shader conforme descrito em Carregamento ou incorporação de um sombreador . Em seguida, crie um objeto ShaderFilter vinculado ao objeto Shader. O objeto ShaderFilter é o filtro aplicado ao objeto filtrado. Você deve aplicá-lo a um objeto da mesma maneira que aplica qualquer filtro. Passe-o para a propriedade filters de um objeto de exibição ou chame o método applyFilter() em um objeto BitmapData. Por exemplo, o código a seguir cria um objeto ShaderFilter e aplica o filtro a um objeto de exibição chamado homeButton .

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

Quando você usa um sombreador como filtro, o filtro deve ser definido com pelo menos uma entrada. Como mostra o exemplo, você não define o valor de entrada no código. Em vez disso, o objeto de exibição filtrado ou o objeto BitmapData é definido como a imagem de entrada. Se usar um sombreador que espera mais de uma entrada, especifique um valor para qualquer entrada além da primeira.

Em alguns casos, um filtro altera as dimensões da imagem original. Por exemplo, um típico efeito de sombra adiciona pixels extra contendo a sombra que é acrescentada à imagem. Quando usar um sombreador que altera as dimensões da imagem, defina as propriedades leftExtension , rightExtension , topExtension e bottomExtension para indicar em quanto você deseja que o tamanho da imagem seja alterado.

O exemplo a seguir demonstra o uso de um sombreador como filtro. O filtro deste exemplo inverte os valores de canal de vermelho, verde e azul de uma imagem. O resultado é a versão “negativa” da imagem.

Nota: O sombreador usado neste exemplo é o kernel do Pixel Bender invertRGB.pbk fornecido com o Pixel Bender Toolkit. É possível carregar o código-fonte do kernel a partir do diretório de instalação do Pixel Bender Toolkit. Compile o código-fonte e salve o arquivo de código de bytes no mesmo diretório do código-fonte.

O código ActionScript importante está nestes dois métodos:

  • init() : o método init() é chamado quando o aplicativo é carregado. Neste método, o código carrega o arquivo de código de bytes do sombreador.

  • onLoadComplete() : no método onLoadComplete() , o código cria o objeto Shader chamado shader . Em seguida, ele cria e desenha o conteúdo de um objeto chamado target . O objeto target é um retângulo preenchido com uma cor gradiente linear que é vermelha à esquerda, verde e amarela no meio e azul claro à direita. O objeto não filtrado é semelhante a este:

    Com o filtro aplicado, as cores são invertidas, e o retângulo fica parecido com o seguinte:

O sombreador usado neste exemplo é o kernel do Pixel Bender de exemplo “invertRGB.pbk” fornecido com o Pixel Bender Toolkit. O código-fonte está disponível no arquivo “invertRGB.pbk” localizado no diretório de instalação do Pixel Bender Toolkit. Compile o código-fonte e salve o arquivo de código de bytes com o nome “invertRGB.pbj” no mesmo diretório que o seu código-fonte do ActionScript.

Veja abaixo o código ActionScript para este exemplo. Use esta classe com a classe de aplicativo principal em um projeto somente ActionScript no Flash Builder ou como a classe do documento para o arquivo FLA no 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 obter mais informações sobre como aplicar filtros, consulte Criação e aplicação de filtros .