Alguns sombreadores definem valores de parâmetros que o sombreador usa para criar seu resultado. Por exemplo, um sombreador que altera o brilho de uma imagem pode especificar um parâmetro de brilho que determina o quanto a operação afeta o brilho. Um único parâmetro definido em um sombreador pode esperar um único valor ou vários valores, de acordo com a definição do parâmetro no sombreador. Cada parâmetro definido em um sombreador é representado no ActionScript por um objeto ShaderParameter. O objeto ShaderParameter é uma propriedade da ocorrência de ShaderData na propriedade de dados do objeto Shader, conforme descrito em
Identificação de entradas e parâmetros de sombreador
. Por exemplo, suponha que um sombreador defina um parâmetro denominado
brightness
e que o sombreador esteja representado por um objeto Shader denominado
myShader
. Nesse caso, você acessa o ShaderParameter que corresponde ao parâmetro
brightness
usando o seguinte identificador:
myShader.data.brightness
Para definir um ou mais valores para o parâmetro, crie uma matriz do ActionScript que contenha o valor ou valores e atribua essa matriz à propriedade
value
do objeto ShaderParameter. A propriedade
value
é definida como uma ocorrência de Array porque é possível que um único parâmetro do sombreador exija vários valores. Mesmo que o parâmetro do sombreador espere um único valor, você deve delimitar o valor em um objeto Array para atribuí-lo à propriedade
ShaderParameter.value
. A listagem a seguir demonstra como definir um único valor como a propriedade
value
:
myShader.data.brightness.value = [75];
Se o código-fonte de Pixel Bender do sombreador definir um valor padrão para o parâmetro, uma matriz que contém o valor ou valores padrão será criada e atribuída à propriedade
value
do objeto ShaderParameter quando o objeto Shader for criado. Depois que a matriz for atribuída à propriedade
value
(inclusive se ela for a matriz padrão), o valor do parâmetro poderá ser alterado com a alteração do valor do elemento de matriz. Você não precisa criar uma nova matriz e atribuí-la à propriedade
value
.
O exemplo a seguir demonstra a configuração de um valor do parâmetro do sombreador no ActionScript. Neste exemplo o sombreador define um parâmetro denominado
color
. O parâmetro
color
é declarado como uma variável
float4
no código-fonte do Pixel Bender, o que significa que ela é uma matriz de quatro números de ponto flutuante. No exemplo, o valor do parâmetro
color
é alterado continuamente e, cada vez que ele é alterado, o sombreador é usado para desenhar um retângulo colorido na tela. O resultado é uma alteração de cor animada.
Nota:
O código para este exemplo foi escrito por Ryan Taylor. Obrigado por compartilhar este exemplo, Ryan. Para ver o portfólio de Ryan e ler seus artigos, acesse
www.boostworthy.com/
.
O código ActionScript está centralizado em torno de três métodos:
-
init()
: no método
init()
, o código carrega o arquivo de código de bytes do Pixel Bender que contém o sombreador. Quando o arquivo é carregado, o método
onLoadComplete()
é chamado.
-
onLoadComplete()
: no método
onLoadComplete()
, o código cria o objeto Shader chamado
shader
. Ele também cria uma ocorrência de Sprite chamada
texture
. No método
renderShader()
, o código desenha o resultado do sombreador em
texture
uma vez por quadro.
-
onEnterFrame()
: o método
onEnterFrame()
é chamado uma vez por quadro, o que cria o efeito de animação. Nesse método, o código define o valor do parâmetro do sombreador como a nova cor e, em seguida, chama o método
renderShader()
para desenhar o resultado do sombreador como um retângulo.
-
renderShader()
: no método
renderShader()
, o código chama o método
Graphics.beginShaderFill()
para especificar um preenchimento do sombreador. Em seguida, ele desenha um retângulo cujo preenchimento é definido pela saída do sombreador (a cor gerada). Para obter mais informações sobre como usar um sombreador desta maneira, consulte
Uso de um sombreador como um preenchimento de desenho
.
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.Shader;
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
public class ColorFilterExample extends Sprite
{
private const DELTA_OFFSET:Number = Math.PI * 0.5;
private var loader:URLLoader;
private var shader:Shader;
private var texture:Sprite;
private var delta:Number = 0;
public function ColorFilterExample()
{
init();
}
private function init():void
{
loader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, onLoadComplete);
loader.load(new URLRequest("ColorFilter.pbj"));
}
private function onLoadComplete(event:Event):void
{
shader = new Shader(loader.data);
texture = new Sprite();
addChild(texture);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void
{
shader.data.color.value[0] = 0.5 + Math.cos(delta - DELTA_OFFSET) * 0.5;
shader.data.color.value[1] = 0.5 + Math.cos(delta) * 0.5;
shader.data.color.value[2] = 0.5 + Math.cos(delta + DELTA_OFFSET) * 0.5;
// The alpha channel value (index 3) is set to 1 by the kernel's default
// value. This value doesn't need to change.
delta += 0.1;
renderShader();
}
private function renderShader():void
{
texture:graphics.clear();
texture.graphics.beginShaderFill(shader);
texture.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
texture.graphics.endFill();
}
}
}
Este é o código-fonte para o kernel de sombreador ColorFilter, usado para criar o arquivo de código de bytes do Pixel Bender “ColorFilter.pbj”:
<languageVersion : 1.0;>
kernel ColorFilter
<
namespace : "boostworthy::Example";
vendor : "Ryan Taylor";
version : 1;
description : "Creates an image where every pixel has the specified color value.";
>
{
output pixel4 result;
parameter float4 color
<
minValue:float4(0, 0, 0, 0);
maxValue:float4(1, 1, 1, 1);
defaultValue:float4(0, 0, 0, 1);
>;
void evaluatePixel()
{
result = color;
}
}
Se você estiver usando um sombreador cujos parâmetros não estão documentados, poderá calcular quantos elementos de qual tipo devem ser incluídos na matriz, marcando a propriedade
type
do objeto ShaderParameter. A propriedade
type
indica o tipo de dado do parâmetro, conforme definido no próprio sombreador. Para obter uma lista de números e tipos de elementos esperados por cada tipo de parâmetro, consulte a listagem da propriedade
ShaderParameter.value
na Referência do ActionScript 3.0.
Cada objeto ShaderParameter também tem uma propriedade
index
que indica onde o parâmetro se ajusta na ordem dos parâmetros do sombreador. Além dessas propriedades, um objeto ShaderParameter pode ter propriedades adicionais que contêm valores de metadados fornecidos pelo autor do sombreador. Por exemplo, o autor pode especificar valores de metadados, como valores mínimos, máximos e padrão para um parâmetro. Todos os valores de metadados especificados pelo autor são adicionados ao objeto ShaderParameter como propriedades dinâmicas. Para examinar essas propriedades, use um loop
for..in
para executar um loop nas propriedades dinâmicas do objeto ShaderParameter para identificar seus metadados. O exemplo a seguir mostra como usar um loop
for..in
para identificar metadados de um objeto ShaderParameter. Cada valor de metadados é adicionado a uma ocorrência de Vector denominada
metadata
. Observe que este exemplo pressupõe que uma ocorrência de Shader denominada
myShader
já foi criada, e que é conhecida como tendo um parâmetro denominado
brightness
:
var brightness:ShaderParameter = myShader.data.brightness;
var metadata:Vector.<String> = new Vector.<String>();
for (var prop:String in brightness)
{
if (brightness[prop] is String)
{
metadata[metadata.length] = brightness[prop];
}
}
// do something with the metadata