Este post é bem uma continuação do anterior, a diferença é que o foco não é o flash e sim o Pixel Bender Toolkit. Mais uma vez, para quem já trabalhou com programação 3D como DirectX e OpenGL isto será mole. Dando uma introdução(zinha) para vocês, shaders são pequenos softwares feitos para rodarem na placa de video (GPU), apesar de ser possível emula-los no CPU também.
Quando as primeiras placas de video chegam no mercado, elas tinha o objetivo de fazer todo o trabalho 3D, os programadores só mandavam para ela as posições dos triângulos no espaço e as texturas deles. Isto foi bom até alguém reclamar dar idéia de os programas influenciarem no render. O processo foi mudado então, antes da GPU criar a imagem a partir dos triângulos, era executado um programa para cada ponto do triângulo que fosse aparecer na tela, aí sim era finalizada a imagem. Após esta imagem pronta ainda era possível executar um outro programa para cada pixel desta imagem que foi gerada. (Um pouco confuso né?! Tentei simplificar). Neste momento os programadores precisavam enviar as posições dos triângulos no espaço, as texturas e os tais shaders.
O shader que é executado junto a geração da imagem passou a ser chamado de Vertex Shader, o segundo, executado após criar a imagem, foi chamado Pixel Shader. A idéia do vertex shader seria modificar a textura, colocando iluminação, reflexo, sobras, bumps, estas coisas, (não que o Pixel Shader não pudesse fazer isto, mas o Vertex Shader é bem específico para esta função). O Pixel Shader vinha para dar o acabamento final da imagem, colocando blurs, saturação, contrastes… enfim, deixando a imagem final bonita, pensar nele como uma alusão a um Photoshop “Lite” não é uma má idéia.
Isto não poderia ser feito pelo CPU?
Em partes, sim, O Pixel Shader poderia ser feito pelo CPU, mas pense no trabalho que seria a GPU acabar de fazer a imagem, enviar para o CPU, fazer o trabalho do pixel shader, devolver para o GPU para então ele jogar na tela… UFF! Pense isto a 60 vezes por segundo! E ainda existem dois fatores mais importantes que este:
- O GPU tem um sistema específico para isto, que nas placas atuais é possível processar vários pixels/pontos do triângulo ao mesmo tempo;
- O CPU já tem bastante coisa para fazer. rs.
Para ajudar vocês entender, dêem uma olhada em http://pt.wikipedia.org/wiki/Pixel_shader
Enfim, o Pixel Bender.
Nesta décima versão do flash player foi introduzido o Pixel Shader, só o Pixel Shader, não tem Vertex Shader. Caso o cliente tenha uma placa 3D, com suporte a shaders, será possível fazer uso dela. O que trará uma melhora de desempenho. Como nem tudo são flores, existe algumas restrições em relação ao shaders usados pelo flash.
Baixe e instale o Flash CS4 ou algum pacote que tenha o Flash CS4, abre o Pixel Bender que foi instalado junto ao Flash.
- File -> Load Image 1, escolha uma.
- File -> New Kernel Filter.
<languageVersion : 1.0;>
kernel NewFilter
< namespace : “Your Namespace”;
vendor : “Your Vendor”;
version : 1;
description : “your description”;
>
{
input image4 src;
output pixel4 dst;
void
evaluatePixel()
{
dst = sampleNearest(src,outCoord());
}
}
Este é o código inicial. NewFilter deve ser trocado para o nome que o arquivo receberá, o resto dentro do < > é alto explicativo. O código é baseado em C e como disse anteriormente, isto é um Pixel Shader, então o input é uma imagem3 ou image4, e a saída deve ser um pixel3 ou pixel4. O número na frente é o número de canais, 3 canais (RGB), 4 canais (RGBA). O pixel4 seria um array4 de floats, float4.
void evaluatePixel é a função main do shader, ela é chamada para cada pixel. float4 sampleNearest( imagem, coordenada ), pega um pixel de imagem baseado na coordenada informada. float2 outCoord() é a coordenada do pixel atual. Se você precisar saber a posição do pixel que está sendo tratado, use esta função.
Como disse que o retorno deve ser pixel4, e pixel4 é o mesmo que float4, podemos trocar a linha: dst = sampleNearest(src,outCoord()); por: dst = float4( 1.0, 1.0, 1.0, 1.0 ); que teremos uma imagem totalmente branca, ou dst = float4( 0.0, 0.0, 0.0, 0.0 ); que teremos uma imagem totalmente preta.
Continua no próximo post.
Março 3, 2009 às 8:03 pm |
First blog I read after wakeup from sleep today!
________________________
The Easiest and Quickest $100 A Day I Know.Email to mike.wilson80@ymail.com for more information.