Pixel Bender’a Giriş - 2

11 Ekim 2008 – 22:03

Bu makale 2 bölümden oluşmaktadır. Bu makalenin ilk bölümüna aşağıdaki adresten ulaşabilirsiniz;

http://enginyoyen.com/blog/tr/index.php/pixel-bendera-giris/

Renk Kanalları

32 Bitlik bir resimde 4 adet renk kanalı vardır(ARGB). Piksel Bender içerisinde bu kanallara ulaşmak ise aslında çok basittir. Elinizden geldiği kadar buradaki mantığı basit olarak bir şekilde düşünün. Bir renk kanalına ulaşmak için renk kanalının ait olduğu bir piksele ulaşmamız gerekiyor. Resim üzerinde değişecek olan piksele ise sampleNearest() fonksiyonu ile ulaşabiliyoruz. Yapmamız gereken yeni bir değişken oluşturup bu değişkene veri türü olarak pixel4 veri türünü atamak. Değer olarak ise resim üzerinde değişecek olan pikeseli sampleNearest() fonksiyonu ile iletmek.

  1. pixel4 channels= sampleNearest(src,outCoord());


Piksel değerlerini aldığımıza göre, renk kanallarına ulaşabiliriz. Herhangi bir renk kanalına ulaşmak için yapmanız gereken değişken isminden sonra renk kanalının baş harfini yazmaktır;

  1. channels.a
  2. channels.r
  3. channels.g
  4. channels.b

Şimdi buna bir örnek verelim. Renk kanalları üzerinde gri tonlama yapabilmek için ihtiyacınız olan mavi ve kırmızı renk kanallarına renk değeri olarak yeşil renk kanalının renk değerini atamak, böylece gri tonlama elde etmiş olacaksınız;

  1. channels.r  =  channels.g;
  2. channels.b =  channels.g;

Evet sadece bu kadar. Ama unutmamamız gereken bir şey daha var o da geriye bir değer döndürmemiz. Sonuç olarak evaluatePixel() fonksiyonunun son hali aşağıdaki gibi olacaktır

  1. evaluatePixel(){
  2.         pixel4 channels= sampleNearest(src,outCoord());
  3.         channels.r =  channels.g;
  4.         channels.b =  channels.g;
  5.         dst = channels;
  6. }

Pixel Bender Renk Kanalları

Koordinatlar

Yazılan kod resim üzerindeki her piksel için işlem yapıyor. Bu da Kernel içerisinde sürekli olarak değişen tek değerin resim üzerinde o anda işlenen pikselin koordinatları demektir. Bu koordinatlara ulaşmak için outCoord() fonksiyonunu kullanacağız. Bu fonksiyon float2 adlı bir veri tipini geriye döndürüyor. Bu veri içerisinde o anda evaluatePixel() fonksiyonu tarafından işlenecek olan x ve y koordinatını yer alıyor.

Buradaki x ve y değeri; x sağ tarafa gittikçe yükseliyor, y ise aşağıya indikçe yükseliyor. Yani başlangıç noktası x:0, y:0 olarak düzenlenmiş ve paralel bir şekilde ilerlemektedir.

Koordinatı almak için şu kodu kullanabilirsiniz;

  1. float2  coord = outCoord();

Yukarıdaki kod size hem x hem de y koordinatını geriye döndürecektir. Tabii eğer sadece x veya sadece y koordinatına ulaşmak istiyorsanız bunu yapmanızda mümkün;

  1. float x = outCoord().x;
  2. float y = outCoord().y;

Aradaki farka dikkat etmeniz gerekli tabi ki. Her iki koordinat için float2 veri türü kullanıyoruz. Ama sadece tek bir koordinat için float veri türünü kullanmamız gerekiyor.

Şimdi bir örnek yapalım, ilk önce resim üzerindeki x ve y koordinatını alalım;

  1. float x = outCoord().x;
  2. float y = outCoord().y;

Daha sonra Mix isimli bir float veri türünde bir değişken oluşturalım, değer olarak ta x ve y koordinatının çarpımının sinüsünü alıp buna artı 10 ekleyelim;

  1. float Mix = (sin(x*y)*10.0);

Daha sonra yapmamız gereken tek şey bunu geriye döndürmek;

  1. dst = sampleNearest(src, outCoord()+Mix);

Sonuç şu şekilde olacaktır;

Pixel Bender Koordinat Düzenlemeleri

Not: Neden sinüs ile değerlerimi topladığıma gelirsek, aslında belirli bir amacı yoktu, sadece deneyerek sonuca ulaştım. Eğer yeniyseniz sizde deneyerek yeni yollar keşfedebilirisiniz, belirli bir süre sonra programı daha iyi kontrol edebilirsiniz.

Parametreler

Yukarıdaki filtre sabit bir değer ile sabit bir sonuç veriyor. Parametreler ise buradaki sonucu istediğimiz gibi ayarlamamıza sağlıyor. Mesela DropShadow filtresinde gölgenin ne kadar olacağını ayarlamak gibi. Bu filtrede deki dağınıklık oranını ayarlamak için bir parametre oluşturacağız. Parametre oluşturmak aslında basit bir işlemdir. Aşağıda örnek bir parametre yer almakta;

  1. parameter float amount
  2.     <
  3.     minValue:0.0;
  4.     maxValue:500.0;
  5.     defaultValue:10.0;
  6.     >;

Paremetre içerisindeki minValue ifadesi parametrenin alacağı minimum değerini, maxValue maksimum değerini, defaultValue ise ilk çalıştığında geçerli olan değeri temsil etmekte. Bu kodu ekleyip “Run” butonuna bastığınız anda 3. alanda şu şekilde bir slider belirecektir;

Pixel Bender - Parametreler

Kodun tamamı ise şu şekilde;

  1. <languageVersion : 1.0;>
  2. kernel MyTestFilter
  3. <   namespace : "enginyoyen.com";
  4.     vendor : "No Vendor";
  5.     version : 1;
  6.     description : "This is a test Filter";
  7. >
  8. {
  9.     input image4 src;
  10.     output pixel4 dst;
  11.  
  12.     parameter float amount
  13.     <
  14.     minValue:0.0;
  15.     maxValue:500.0;
  16.     defaultValue:10.0;
  17.     >;
  18.    
  19.     void
  20.     evaluatePixel()
  21.     {
  22.         float x = outCoord().x;
  23.         float y = outCoord().y;
  24.         float Mix = (sin(x*y)*amount);
  25.         dst = sampleNearest(src, outCoord()+Mix);
  26.     }
  27. }

Şimdi resimdeki karelenme olayını istediğimiz kadar arttırıp azaltabiliriz. Aşağıdaki görüntü amount değerini 50 olarak düzenlediğimizde sonuç aşağıdaki gibi oluyor;

Pixel Bender - Amount

Kapanış

Bir sonraki makalede oluşturduğumuz filtreleri Actionscript içerisinde nasıl kullanıldığına değineceğim. Pixel Bender ilk başta zor gözükebilir, ama belirli kalıpları öğrendikten sonra geriye kalan tek şey uzun süren denemeler ve yaratıcılık.

Kolay Gelsin
Engin!

Bu makale ile ilgili olabilecek yazılar


  1. 1 Trackback(s)

  2. Eki 11, 2008: Engin Yöyen - Stay Updated On Web » Blog Archive » Pixel Bender’a Giriş - 1

Yorum Ekleyin