DevSecOps

28 jul, 2011

Introdução ao Pixel Bender e Shader para Flash Player 10

Publicidade

Este artigo vai abordar a sintaxe
do Pixel Bender e como escrever seus próprios arquivos Pixel Bender, além de
como carregar arquivos Pixel Bender no Flash e usá-los de diferentes
maneiras
.

Começando com o Pixel Bender

O Flash
Player 10 veio com novas classes para carregar e para usar os arquivos Pixel Bender
nos nossos aplicativos Flash. Neste artigo, iremos dar uma olhada na sintaxe
do Pixel Bender e como escrever seus próprios arquivos Pixel Bender. Iremos ver
também como carregar arquivos Pixel Bender no Flash e usá-los de diferentes
maneiras.

Primeiramente,
você precisa fazer o download do Pixel Bender Toolkit
aqui. O Pixel Bender Toolkit vem com um conjunto de filtros Pixel
Bender, então sinta-se à vontade para estudá-los e para compreender melhor a sintaxe
do Pixel Bender. Você também pode procurar na web por filtros adicionais do
Pixel Bender.

Neste artigo, criaremos alguns filtros simples com o Pixel Bender Toolkit e mais
tarde iremos utilizar filtros já existentes. Então, vamos começar.

Inicie o Pixel Bender Toolkit e escolha “New
Kernel”, e um arquivo kernel completamente novo de trabalho é
automaticamente criado para você. Você já pode executar esse filtro e provavelmente será requisitado para carregar uma imagem e, depois disso, o filtro será executado. Claro que a única coisa que esse filtro está fazendo
até agora é copiar cada pixel da base da imagem para a imagem de output, então
ele não é tão útil, mas vamos dar uma olhada nele assim mesmo. Primeiro, você
tem a descrição do kernel:

kernel NewFilter
< namespace : "Your Namespace";
vendor : "Your Vendor";
version : 1;
description : "your description";
>

Você pode nomear o seu
filtro aqui, e pode também inserir outras informações, como a versão do filtro,
sua descrição e assim por diante. Em seguida:

input image4 src;
output pixel4 dst;

Você especifica um input do
tipo image4 (4 canais) e o nome “src”. O filtro irá usar esse input como base.
Você também especifica um output do tipo pixel4 (4 canais) e o nome “dst”. O
filtro passará o resultado do seu cálculo para esse output. Então:

void
evaluatePixel()
{
dst = sampleNearest(src,outCoord());
}

Essa função (evaluatePixel)
vai rodar uma vez para cada elemento (pixel) dos seus dados de input. O
método sampleNearest retorna o valor de um pixel, e esse valor é
atribuído ao output “dst”. O método sampleNearest pega a fonte (no nosso caso,
uma fonte image4), e um conjunto de coordenadas (outCoord() retorna as coordenadas
do elemento atual ou pixel). Se você passar uma image4, você terá de volta um
valor pixel4; se você passasse uma image3, você iria ter um pixel3, e assim por
diante. O número determina quantos valores você recebe, ou tem que configurar,
por exemplo:

float myfloat = 1.0;//one value
float2 myotherfoat = float2(1.0,1.0);//two values
float3 mythreefoat = float3(1.0,1.0,1.0);//three values
float4 myfourfoat = float4(1.0,1.0,1.0,1.0);//four values

Fazer type cast é possível,
claro, se os types forem compatíveis, como de .int para float, por exemplo. É
óbvio que se você tentar passar um pixel 3 para uma image4, você terá um erro,
então preste atenção nisso. Vamos modificar nosso código de modo que nosso
output fique diferente:

dst = pixel4(sin(float4(sampleNearest(src,outCoord()))));

Você deve ter uma pequena
alteração no brilho da sua imagem. Você provavelmente sabe o que o método sin
faz. Aqui moldamos nosso resultado sampleNearest em um float4 (então fizemos o
type cast de um pixel4 para float4) para podermos aplicar o método sin, então
é claro que fizemos o type cast de volta para pixel 4 para conseguir atribuir o
resultado ao nosso output. Você pode experimentar com os inúmeros métodos
matemáticos e ver os resultados que você obtém. Tente este, por exemplo:

dst = pixel4(sqrt(float4(sampleNearest(src,outCoord()))));

Além disso, nós poderíamos
separar cada pixel e aplicar um cálculo em cada um deles:

pixel4 temp = sampleNearest(src,outCoord());
dst = temp;

De volta ao início, mas
aqui temos nossos pixels armazenados em uma variável, de modo que podemos
acessá-los individualmente. Então, vamos fazer isso agora:

pixel4 temp = sampleNearest(src,outCoord());
temp.r = 0.0;
dst = temp;

Aqui nós
basicamente desligamos o canal vermelho de modo que todo o vermelho saiu da
nossa imagem. Você poderia aplicar inúmeras operações matemáticas nesses pixels
e obter resultados incríveis. Claro que o seu nível em matemática irá
determinar sua habilidade em criar filtros complexos, mas isso cabe a você
descobrir. Agora é hora de vermos o que podemos fazer com filtros Pixel Bender
no Flash, e pelo caminho iremos olhar para mais códigos Pixel Bender.

?

Texto original disponível em http://www.actionscript.org/resources/articles/876/1/Introduction-to-Pixel-Bender-and-Shader-for-Flash-Player-10/Page1.html