Pixel Bender’a Giriş - 1
11 Ekim 2008 – 21:37Pixel Bender’a Genel Bakış adlı makalede bu programın ne olduğunu, nasıl çalıştığını, programın bölümlerini, kullanılan dili buna benze bilgileri vermiştim. Bu makalede anlatılanlar öncekinin bir devamı olarak düzenlendi. Bu yüzden başlamadan önce aşağıdaki adresten bir önceki bölümü okumanızı tavsiye ederim.
http://enginyoyen.com/blog/tr/index.php/pixel-bendera-genel-bakis/
Bu bölümde Pixel Bender ile basit bir kodlamanın nasıl yapıldığına değineceğim. Buradaki dil C tabanlı bir dil. Bu yüzden ilk başta sizi zorlayabilir. Ama elimden geldiği kadar basite indirgeyip kodların ne iş yaptığını teker teker anlatacağım.
Pixel Bender Toolkit
Pixel Bender Toolkit programına aşağıdaki adresten ulaşabilirsiniz;
http://labs.adobe.com/wiki/index.php/Pixel_Bender_Toolkit
Eğer Flash CS4 kullanmaya başladıysanız bilgisayarınızda yüklü olması gerekiyor. Eğer değilse yukarıdaki adresten indirebilirsiniz. Tabi ki IDE ücretsizdir.
Programı indirdiğinizi varsayıyorum, program üç bölümden oluşmakta.
![]()
Birinci bölüm yazılan kodun resim üzerindeki etkisini görmeniz için eklenen resmin yeridir. Buradaki resim sadece test amaçlıdır ve istediğiniz herhangi bir resim olabilir. Amaç sadece yazılan kodun etkisini birebir görmektir.
İkinci bölüm kodun yazıldığı yerdir. Basit bir kod editörü yani.
Üçüncü bölüm ise oluşturduğunuz filtredeki parametrelerin kontrol edildiği yerdir. Buradaki parametreyi Blur filtresindeki x koordinatına verilen blur miktarı olarak düşünün. Blur filtresi üç adet parametre kabul ediyordu. Eğer bu filtreyi burada hazırlarsak, bu üç parametrede üçüncü bölümde yer alacaktır.
Resim Eklemek
Buraya resim eklemek çok basit bir işlem tek yapmanız gereken “File” menüsünden “Load Image” seçeneğine tıklamak.

İlk açtığınızda karşınıza örnek resimlerin olduğu bir klasör çıkacaktır. İsterseniz buradaki resimleri, isterseniz bilgisayarınızdaki başka bir resmi bu alana yükleyebilirisiniz. Buradaki resim sadece test amaçlı olarak kullanılacaktır. Yani yazdığınız kodun sonucunu anlık olarak görmeniz içindir.
Yeni Bir Filtre Oluşturmak
Pixel Bender içerisinde oluşturacağınız filtreler için belirli kod bloklarının kesinlikle olması gerekir. Buradaki kodlar ana yapıyı oluşturan kodlardır. Bu kodları iki şekilde ekleyebilirsiniz. Birincisi 3. bölümün en altında yer alan “Create a new Filter” butonuna tıklayarak, ikincisi ise “File” menüsü altından “New Kernel Fitler” seçeneğini seçmektir. Bu butonların herhangi birine tıkladığınızda karşınıza aşağıdaki şekilde bir kod bloğu çıkacaktır;
-
<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());
-
}
-
}
Yukarıdaki kod bloğu çok basit ve hiçbir işlem yapmayan bir filtredir. Yani yukarıdaki kod bloğu aslında bir filtredir. Şimdi buradaki kodların ne iş yaptığını değinelim;
En sütteki languageVersion ifadesi Pixel Bender’in kullandığı dilin versiyonunu belirtmekte.
Ondan sonraki kod bloğu ise Kernel olarak anılmakta. Her bir filtrede bir adet Kernel olmak zorundadır. Daha karışık resim işleme algoritmalarında ise birden fazla kullanılabilir. Alışageldiğimizden dilden anlatmak gerekirse Kernel bir objedir. Bu obje birden çok pikselin birleşmesiyle tek bir piksel sonuç döndüren bir objedir. Yani bir pikselin etrafındaki piksellerin toplayıp bunun ortalamasını aldıktan sonra bunu sonuç olarak döndürür. Bu farklı şekillerde olabilir yani kernelin içerisine alacağı piksel bir nokta etrafındaki piksel olmak zorunda değildir. Bu örneği sadece daha rahat anlamanız için verdim. Bunu biraz daha iyi anlayabilmek için aşağıdaki resimden faydalanabilirisiniz. Aşağıdakini 20×20 boyutlarında bir resim olarak düşünün. Kernek içerisinde siyah noktaları alıyor ve sonuç olarak kırmızı noktayı döndürüyor. Tabii bunu tek bir piksel için değil resim üzerindeki tüm pikseller için yapıyor.

Şimdi kodun içeriğine geçebiliriz. Kernel ifadesinden sonraki NewFilter ifadesi filtremizin adıdır. Yani bu NewFilter yerine BlurFilter, MyFilter, ShadowFilter gibi isimler alabilir. Bu size kalmış. Kernel içerisindeki diğer bilgiler ise kodu yazanın tanıtımıdır diyebiliriz. Namespace arada çıkacak isim karışıklıklarını önlemek için kullanılıyor. Mesela iki kişi aynı isimle filtre yapabilir. Bu karışıklığı çözmek için namespace kullanılıyor. Vendor ise filtreyi yapan şirkeitn adı. Daha sonraki iki satır ise kodun versiyonu ve tanımıdır.
-
kernel NewFilter
-
< namespace : "Your Namespace";
-
vendor : "Your Vendor";
-
version : 1;
-
description : "your description";
-
>
Yukarıdaki kod kısmı sabit olan kısımlar, şimdi ise kodlamanın yapılacağı kod bloğuna bakalım;
-
{
-
input image4 src;
-
output pixel4 dst;
-
-
void
-
evaluatePixel()
-
{
-
dst = sampleNearest(src,outCoord());
-
}
-
}
İlk olarak input image4 src; ifadesini göz atalım. Bu ifade Kernel içerisinde kullandığımız resmi temsil eden resim türüdür. Buradaki image4 ifadesi 4 kanallı bir Bitmap verisini temsil ediyor. (Alpha:Şeffaflık, Red:Kırmızı, Green:Yeşil, Blue:Mavi). Pixel Bender 1.0 kendi içerisinde bu dört kanalıda destekliyor. (image1, image2, image3, image4).
Flash içerisinde 24 veya 32 bitlik resimler kullanılır. 24 Bitlik resimler 3 kanaldan oluşur(RGB). 32 bitlik resimler ise 4 renk kanalından oluşur(ARGB). Bizim burada kullandığımız image4 ifadesi ise 32 bitlik Bitmap verisini temsil ediyor.
En sondaki src(Source) ifadesi ise kaynak olduğunu belirtiyor.
Bir sonraki satırda output pixel4 dst; ifadesi yer almakta. Buradaki mantıkta yukarıdaki gibi çalışmakta, input pikselin girişini sağlamakta output ise pikselin son halini sağlamakta. En sondaki dst(Destination) ifadesi ise hedef olduğunu belirtiyor.
Buradaki src ve dst ifadeleri gelen ve giden veriyi temsil ediyor. Mesela herhangi bir pikselin renk kanalına ulaşmak için src ifadesini kullanmamız gerekiyor.
Sırada ise evaluatePixel fonksiyonu yer almakta. Her kernel içerisinde olması zorunlu olarak olması gereken bir fonksiyon. Bu fonksiyon resim üzerindeki her bir piksel için çalışacaktır. Yani pikseller üzerindeki esas değişiklik bu kısımda yapılıyor. Fonksiyonun ana görevi bu olduğundan dolayı unutmamanız gereken bu fonksiyon içerisinde kesinlikle geriye pixel veri türünden bir veriyi döndürmeniz gerekiyor.
Fonksiyonun içerisindeki koda gelirsek, buradaki dst ifadesi bizim geriye dönen piksel değerimiz olduğunu biliyoruz. Atanan değer ise sampleNearest fonksiyonundan geriye dönen değer. sampleNearest fonksiyonu verilen parametredeki piksele ulaşarak buradaki değeri geriye döndürür. Fonksiyon iki adet parametre alıyor, birincisi kaynak resim, ki bu da bizim src değerimiz oluyor. İkincisi ise alınacak olan pikselin koordinatı. Koordinatı almak için ise outCoord() fonksiyonunu kullanıyoruz.
Şimdi yukarıdaki kod bloğunun bir filtre olduğunu söylemiştik. Bu filtrenin sonucunu görmek için alt taraftaki “Run” butonuna tıklamanız gerekiyor. Tıkladığınızda şu anda hiçbir şey değişmeyecektir. Bunun sebebi bizim piksellerde hiçbir değişiklik yapmamamızdır. Yani içerisine aldığı pikseli aynı şekilde geriye döndürüyor. Bundan sonraki makalelerde ise Adobe Pixel Bender içerisinde kullanılan fonksiyonları örneklerle açıklayacağım.
Kapanış
Bu makale iki bölümden oluşmaktadır. İkinci bölümde ise örnek bir filtre yaratılıp bu filrentin kullanımına değinecegim. Bu makalenin ikinci kısmına aşağıdaki adresten ulaşabilirsiz;
http://enginyoyen.com/blog/tr/index.php/pixel-bendera-giris-2/
Kolay Gelsin
Engin

1 Trackback(s)