Adobe Pixel Bender: un nou nivel în procesarea imaginilor pentru bliț
Programul pentru Pixel Bender este salvat ca un fișier cu extensia „PBK“, atunci aceste fișiere pot fi fie descărcate direct miercuri, Adobe Photoshop CS sau Adobe After Effects CS, sau puteți compila kernel-program de „PBJ“ fișier care poate fi descărcat și este executat de mediul de execuție flashplayer. Aici este un punct important: dacă vom crea o aplicație este de a rula în mediul FlashPlayer, atunci nu vom avea acces la toate funcționalitatea limbii Pixel Bender Kernel. De asemenea, nu va exista suport pentru limba Limba grafică (o listă detaliată a acestor restricții poate fi găsită și în ajutorul primit împreună cu Pixel Bender Toolkit). Acum voi aduce piesa de lucru a programului la Pixel Bender Kernel. Poți obține acest stoc în orice moment dacă selectezi elementul de meniu "Fișier -> Kernel nou":
kernelul NewFilter
input image4 src;
ieșire pixel4 dst;
void evaluatePixel () dst = eșantionul cel mai apropiat (src, outCoord ());
>
>
float bool int pixel1 imagine1
float2 bool2 int2 pixel2 imagine2
float3 bool3 int3 pixel3 imagine3
float4 bool4 int4 pixel4 imagine4
Utilizarea unor astfel de tipuri de date vectoriale este foarte convenabilă, deoarece toate operațiile aritmetice sunt "supraîncărcate" și sunt capabile să înmulțească, să împartă și să adauge vectori unul la celălalt. Aici merită menționat operațiunea swizzling. Esența swizzling-ului este aceea că dintr-un vector, de exemplu, din patru elemente, dorim să luăm doar trei, de exemplu, primul, al treilea și al patrulea element. Și apoi putem construi o nouă variabilă a dimensiunii 3, iar elementele în sine pot fi rearanjate, de exemplu:
float4 vec4;
float4 roșu = vec4.rrrr
float3 rgb_only = vec4.rgb
dst = sampleNearest (src, outCoord ());
Aici se spune că variabila "dst" (rezultatul calculului shaderului) este obținută ca urmare a apelarea probei funcțieiNearest. Ce face funcția sampleNearest? S-ar putea spune că funcția sampleNearest ia pur și simplu un pixel din imagine (primul argument) în coordonatele date, dar acest lucru nu este în întregime adevărat. În grafica computerizată există un exemplu de eșantionare sau eșantionare și calcularea unei anumite valori pe baza listei de eșantioane (deși termenul de eșantionare este aplicabil și în alte domenii de activitate). Să presupunem că avem sarcina „trage“ textura dată inițial în forma imaginii de referință (o dimensiune de 200 cu 200 pixeli), pe suprafața mai mare sau mai mică. Aici, nu putem uni în mod unic fiecare pixel de ieșire cu un singur pixel de intrare (pixeli pot fi triviali lipsiți). Prin urmare, sarcina noastră este de a „întinde“ sau „micșora“ imaginea, dar într-un mod de a evita artefacte dăunătoare (încețoșați, inexactități, etc.). Există mai multe algoritmi pentru rezolvarea acestei probleme, dar de multe ori se ajunge la ceea ce vom lua pentru o anumită coordonate nu este un singur pixel, și câțiva pixeli din jur, și se calculează pe baza valorilor lor de culoare ale unui pixel situat în mijloc. Deci, în Pixel Bender există trei funcții de eșantionare (există și versiuni de funcții care funcționează cu imagini și pixeli în dimensiunea a două, trei și patru canale):
Eșantionul pixel4 (imagine4 im, float2 v)
Experimentul pixel4Linear (image4 im, float2 v)
pixel4 sampleNearest (imagine4 im, float2 v)
Funcțiile eșantion și probăLinear fac același lucru: calculați culoarea rezultată pe baza interpolării liniare a culorii pixelilor vecini. Eșantionul de funcții mai întâi ia culoarea unui pixel, situat cel mai aproape de coordonatele de ieșire solicitate. În ceea ce privește funcția outCoord (), returnează coordonatele pixelilor, culoarea cărora este acum calculată. Aceasta înseamnă că dacă execut scriptul de exemplu pe care îl rulez, atunci obținem o imagine, una la alta, care se potrivește cu imaginea de intrare. Să verificăm asta. Pentru aceasta, în meniul "Fișier", selectăm elementul "Încărcare imagine 1" și apoi orice imagine. După ce faceți clic pe butonul "F5", vom vedea, după cum era de așteptat, imaginea originală (codul nostru a copiat imaginea). Pentru a verifica dacă totul funcționează corect, puteți modifica shader-ul nostru, de exemplu, după cum urmează:
void evaluatePixel () dst = pixel4 (0,0,1,1);
>
pachet import flash.display. *;
import flash.events. *;
import flash.net. *;
fișiere flash de import. *;
[SWF (lățime = "600", înălțime = "400", fundalColor = "# aa0000", framerate = "30")]
clasa publică principală extinde Sprite
[Embed (sursă = '/ lisa.png')]
privat var fotoClass: Clasa;
privat var fotoImage: Bitmap = noua fotografieClass ()
privat var urlLoader: URLLoader = null;
funcția publică principală (): void addChild (fotoImage);
var urlRequest: URLRequest = noua adresă URLRequest ("shader.pbj");
urlLoader = noul URLLoader ();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener (Event.COMPLETE, applyFilter);
urlLoader.load (urlRequest);
>
funcția privată applyFilter (eveniment: Eveniment): voidurlLoader.removeEventListener (Event.COMPLETE, applyFilter);
var shader: Shader = Shader nou (event.target.data);
var shaderFilter: ShaderFilter = ShaderFilter nou (shader);
fotoImage.filters = [shaderFilter];
>
>>
black zorro, black-zorro.com