Gölgelendirici girdisi ve parametre değerlerini belirtme

Flash Player 10 ve üstü, Adobe AIR 1.5 ve üstü

Birçok Pixel Bender gölgelendiricisi, gölgelendirici işlemede kullanılan bir veya daha fazla girdi görüntüsünü kullanmak için tanımlanır. Örneğin, bir gölgelendiricinin belirli bir efekt uygulanmış bir kaynak görüntüsünü ve çıktısını kabul etmesi çok yaygın bir durumdur. Gölgelendiricinin nasıl kullanıldığına bağlı olarak, girdi değeri otomatik olarak belirtilebilir veya sizin açıkça bir değer sağlamanız gerekebilir. Aynı şekilde, birçok gölgelendirici, gölgelendirici çıktısını özelleştirmek için kullanılan parametreleri belirtir. Ayrıca gölgelendiriciyi kullanmadan önce her parametre için açıkça bir değer ayarlamanız gerekir.

Gölgelendirici girdilerini ve parametrelerini ayarlamak ve belirli bir gölgelendiricinin girdi mi yoksa parametre mi beklediğini belirlemek için Shader nesnesinin data özelliğini kullanırsınız. data özelliği bir ShaderData örneğidir.

Gölgelendirici girdilerini ve parametrelerini tanımlama

Gölgelendirici girdisinin ve parametre değerlerinin belirtilmesinde birinci adım, kullandığınız belirli gölgelendiricinin herhangi bir girdi görüntüsü veya parametre bekleyip beklemediğini öğrenmektir. Her Shader örneği, ShaderData nesnesini içeren bir data özelliğine sahiptir. Gölgelendirici herhangi bir girdi veya parametreyi tanımlıyorsa, bu girdi ya da parametreye, ShaderData nesnesinin özellikleri olarak erişilir. Özelliklerin adları, gölgelendirici kaynak kodunda girdiler ve parametreler için belirtilen adlarla eşleşir. Örneğin, bir gölgelendirici src adındaki bir girdiyi tanımlıyorsa, ShaderData nesnesi o girdiyi temsil eden src adındaki bir özelliğe sahiptir. Bir girdiyi temsil eden her özellik ShaderInput örneğidir ve bir parametreyi temsil eden her özellik de ShaderParameter örneğidir.

İdeal olarak, gölgelendiricinin yazarı, gölgelendirici için gölgelendiricinin hangi girdi görüntüsü değerlerini ve parametrelerini beklediği, neyi temsil ettiği, uygun değerlerinin ne olduğu, vb. bilgileri sunan belgeler sağlar.

Ancak gölgelendirici bu tür bir belge içermiyorsa (ve kaynak koduna sahip değilseniz), girdileri ve parametreleri tanımlamak için gölgelendirici verilerini inceleyebilirsiniz. Girdileri ve parametreleri temsil eden özellikler, dinamik olarak ShaderData nesnesine eklenir. Sonuç olarak, for..in döngüsünü kullanarak, ShaderData nesnesinin ilişkilendirilmiş gölgelendiricisinin herhangi bir girdiyi mi yoksa parametreyi mi tanımladığını öğrenmek için ShaderData nesnesini inceleyebilirsiniz. Gölgelendirici meta verilerine erişme bölümünde açıklandığı gibi, gölgelendirici için tanımlanan herhangi bir meta veri değerine Shader.data özelliğine eklenmiş bir dinamik özellik olarak da erişilebilir. Gölgelendirici girdilerini ve parametrelerini tanımlamak için bu tekniği kullandığınızda, dinamik özelliklerin veri türünü kontrol edin. Bir özellik ShaderInput örneğiyse, bir girdiyi temsil eder. Özellik ShaderParameter örneğiyse, bir parametreyi temsil eder. Aksi takdirde özellik bir meta veri değeridir. Aşağıdaki örnek, for..in döngüsü kullanılarak bir gölgelendiricinin data özelliğinin dinamik özelliklerinin nasıl incelendiğini gösterir. Her girdi (ShaderInput nesnesi), inputs adındaki bir Vector örneğine eklenir. Her parametre (ShaderParameter nesnesi), parameters adındaki bir Vector örneğine eklenir. Son olarak, her meta veri metadata adındaki bir Vector örneğine eklenir. Bu örnekte, myShader adında bir Shader örneğinin önceden oluşturulduğunun varsayıldığını unutmayın:

var shaderData:ShaderData = myShader.data; 
var inputs:Vector.<ShaderInput> = new Vector.<ShaderInput>(); 
var parameters:Vector.<ShaderParameter> = new Vector.<ShaderParameter>(); 
var metadata:Vector.<String> = new Vector.<String>(); 
 
for (var prop:String in shaderData) 
{ 
    if (shaderData[prop] is ShaderInput) 
    { 
        inputs[inputs.length] = shaderData[prop]; 
    } 
    else if (shaderData[prop] is ShaderParameter) 
    { 
        parameters[parameters.length] = shaderData[prop]; 
    } 
    else 
    { 
        metadata[metadata.length] = shaderData[prop]; 
    } 
} 
 
// do something with the inputs or properties

Gölgelendirici girdisi değerlerini belirtme

Birçok gölgelendirici, gölgelendirici işlemede kullanılan bir veya daha fazla girdi görüntüsü bekler. Ancak birçok durumda, Shader nesnesi kullanıldığında otomatik olarak bir girdi belirtilir. Örneğin, bir gölgelendiricinin tek bir girdi gerektirdiğini ve bu gölgelendiricinin de filtre olarak kullanıldığını varsayın. Bir görüntüleme nesnesine veya BitmapData nesnesine filtre uygulandığında, o nesne otomatik şekilde girdi olarak ayarlanır. Bu durumda açıkça bir girdi değeri belirtmeniz gerekmez.

Ancak bazı durumlarda, özellikle gölgelendirici birden çok girdi tanımlıyorsa, girdi için açıkça bir değer ayarlarsınız. Bir gölgelendiricide tanımlanan her girdi, bir ShaderInput nesnesi tarafından ActionScript'te temsil edilir. Gölgelendirici girdilerini ve parametrelerini tanımlama bölümünde açıklandığı gibi, ShaderInput nesnesi, Shader nesnesinin data özelliğinde ShaderData örneğinin bir özelliğidir. Örneğin, bir gölgelendiricinin src adında bir girdiyi tanımladığını ve bu gölgelendiricinin myShader adındaki bir Shader nesnesine bağlandığını varsayın. Bu durumda, şu tanımlayıcıyı kullanarak src girdisine karşılık gelen ShaderInput nesnesine erişirsiniz:

myShader.data.src

Her ShaderInput nesnesi, girdinin değerini ayarlamak için kullanılan bir input özelliğine sahiptir. Görüntü verilerini belirtmek için input özelliğini bir BitmapData örneğine ayarlarsınız. Ayrıca input özelliğini bir BitmapData veya Vector öğesine ayarlayabilirsiniz.<Number> örneğine ayarlayabilirsiniz. BitmapData veya Vector.Girdi olarak <Number> örneği için, http://help.adobe.com/tr_TR/FlashPlatform/reference/actionscript/3/flash/display/ShaderInput.html#input'ndaki ShaderInput.input listesine bakın.

ShaderInput nesnesi, input özelliğine ek olarak girdinin ne tür bir görüntü beklediğini belirlemek için kullanılabilen özelliklere de sahiptir. Bu özellikler arasında width, height ve channels özellikleri yer alır. Her ShaderInput nesnesi ayrıca girdi için açıkça bir değerin sağlanması gerekip gerekmediğinin belirlenmesinde kullanışlı olan index özelliğine de sahiptir. Gölgelendirici otomatik olarak ayarlı sayıdan daha fazla girdi bekliyorsa, bu durumda söz konusu girdilerin değerlerini ayarlarsınız. Gölgelendiricinin farklı kullanım şekilleri ve girdi değerlerinin otomatik olarak ayarlanıp ayarlanmaması hakkında ayrıntılı bilgi almak için, bkz. Gölgelendirici kullanma.

Gölgelendirici parametre değerlerini belirtme

Bazı gölgelendiriciler, gölgelendiricinin sonuçlarını oluşturmakta kullandığı parametre değerlerini tanımlar. Örneğin, bir görüntünün parlaklığını değiştiren bir gölgelendirici, işlemin parlaklığı ne kadar etkilediğini belirleyen bir parlaklık parametresini belirtebilir. Gölgelendiricide tanımlanan tek bir parametre, gölgelendiricideki parametre tanımına göre tek bir değer veya birden çok değer bekleyebilir. Bir gölgelendiricide tanımlanan her parametre, bir ShaderParameter nesnesi tarafından ActionScript'te temsil edilir. Gölgelendirici girdilerini ve parametrelerini tanımlama bölümünde açıklandığı gibi, ShaderParameter nesnesi, Shader nesnesinin data özelliğinde ShaderData örneğinin bir özelliğidir. Örneğin, bir gölgelendiricinin brightness adında bir parametreyi tanımladığını ve bu gölgelendiricinin myShader adındaki bir Shader nesnesi tarafından temsil edildiğini varsayın. Bu durumda, şu tanımlayıcıyı kullanarak brightness parametresine karşılık gelen ShaderParameter nesnesine erişirsiniz:

myShader.data.brightness

Parametre için bir değer (veya değerler) ayarlamak üzere, değer ya da değerleri içeren bir ActionScript dizisi oluşurun ve ShaderParameter nesnesinin value özelliğine bu diziyi atayın. Tek bir gölgelendirici parametresi birden çok değer gerektirebildiğinden, value özelliği bir Array örneği olarak tanımlanır. Gölgelendirici parametresi yalnızca tek bir değer beklese de, değeri ShaderParameter.value özelliğine atamak için bir Array nesnesinde sarmanız gerekir. Aşağıdaki liste, value özelliği olarak tek bir değer ayarlanmasını gösterir:

myShader.data.brightness.value = [75];

Gölgelendiricinin Pixel Bender kaynak kodu, parametrenin varsayılan değerini tanımlıyorsa, Shader nesnesi oluşturulduğunda varsayılan değeri veya değerleri içeren bir dizi oluşturulur ve ShaderParameter nesnesinin value özelliğine atanır. value özelliğine bir dizi atandıktan sonra (varsayılan diziyse dahil edilir), dizi öğesinin değeri değiştirilerek parametre değeri değiştirilebilir. Yeni bir dizi oluşturup bunu value özelliğine atamanız gerekmez.

Aşağıdaki örnek, ActionScript'te bir gölgelendiricinin parametre değerinin ayarlanmasını gösterir. Bu örnekte, gölgelendirici color adında bir parametreyi tanımlar. color parametresi, Pixel Bender kaynak kodunda bir float4 değişkeni olarak bildirilir, başka bir deyişle bu, dört kayan nokta numarası dizisidir. Örnekte, color parametre değeri sürekli olarak değiştirilir ve bu değer her değiştiğinde ekranda renkli bir dikdörtgen çizmek için gölgelendirici kullanılır. Sonuçta, animasyon uygulanmış bir renk değişimi elde edilir.

Not: Bu örneğin kodunu Ryan Taylor yazmıştır. Bu örneği bizimle paylaştığı için Ryan'a teşekkür ediyoruz. Şu adreste Ryan'ın portföyünü görebilir ve yazılarını okuyabilirsiniz: www.boostworthy.com.

ActionScript kodunun merkezinde üç yöntem bulunur:

  • init(): init() yönteminde kod, gölgelendiriciyi içeren Pixel Bender bayt kodu dosyasını yükler. Dosya yüklendiğinde, onLoadComplete() yöntemi çağrılır.

  • onLoadComplete(): onLoadComplete() yönteminde kod, shader adında bir Shader nesnesi oluşturur. Ayrıca texture adında bir Sprite örneği oluşturur. renderShader() yönteminde kod her kare için bir defa gölgelendirici sonucunu texture öğesine çizer.

  • onEnterFrame(): Her kare için birer kere onEnterFrame() yöntemi çağrılarak animasyon efekti oluşturulur. Bu yöntemde kod, gölgelendirici parametresi değerini yeni renge ayarlar ve sonra bir dikdörtgen olarak gölgelendirici sonucunu çizmek için renderShader() yöntemini çağırır.

  • renderShader(): renderShader() yönteminde kod, bir gölgelendirici dolgusu belirtmek için Graphics.beginShaderFill() yöntemini çağırır. Daha sonra gölgelendirici çıktısı (oluşturulan renk) tarafından dolgusu tanımlanan bir dikdörtgen çizer. Bir gölgelendiricinin bu şekilde kullanılması hakkında daha fazla bilgi almak için, bkz. Gölgelendiriciyi çizim dolgusu olarak kullanma.

Aşağıda, bu örneğin ActionScript kodu verilmiştir. Bu sınıfı Flash Builder'da yalnızca ActionScript projesi için ana uygulama sınıfı olarak veya Flash Professional'da FLA dosyasının belge sınıfı olarak kullanın:

package 
{ 
    import flash.display.Shader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.URLRequest; 
     
    public class ColorFilterExample extends Sprite 
    { 
        private const DELTA_OFFSET:Number = Math.PI * 0.5; 
        private var loader:URLLoader; 
        private var shader:Shader; 
        private var texture:Sprite; 
        private var delta:Number = 0; 
         
        public function ColorFilterExample() 
        { 
            init(); 
        } 
         
        private function init():void 
        { 
            loader = new URLLoader(); 
            loader.dataFormat = URLLoaderDataFormat.BINARY; 
            loader.addEventListener(Event.COMPLETE, onLoadComplete); 
            loader.load(new URLRequest("ColorFilter.pbj")); 
        } 
         
        private function onLoadComplete(event:Event):void 
        { 
            shader = new Shader(loader.data); 
             
            texture = new Sprite(); 
             
            addChild(texture); 
             
            addEventListener(Event.ENTER_FRAME, onEnterFrame); 
        } 
        private function onEnterFrame(event:Event):void 
        { 
            shader.data.color.value[0] = 0.5 + Math.cos(delta - DELTA_OFFSET) * 0.5; 
            shader.data.color.value[1] = 0.5 + Math.cos(delta) * 0.5; 
            shader.data.color.value[2] = 0.5 + Math.cos(delta + DELTA_OFFSET) * 0.5; 
            // The alpha channel value (index 3) is set to 1 by the kernel's default 
            // value. This value doesn't need to change. 
             
            delta += 0.1; 
             
            renderShader(); 
        } 
         
        private function renderShader():void 
        { 
            texture:graphics.clear(); 
            texture.graphics.beginShaderFill(shader); 
            texture.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); 
            texture.graphics.endFill(); 
        } 
    } 
}

Aşağıda, “ColorFilter.pbj” Pixel Bender bayt kodu dosyasını oluşturmak için kullanılan, ColorFilter gölgelendirici çekirdeğinin kaynak kodu verilmiştir:

<languageVersion : 1.0;> 
kernel ColorFilter 
< 
    namespace : "boostworthy::Example"; 
    vendor : "Ryan Taylor"; 
    version : 1; 
    description : "Creates an image where every pixel has the specified color value."; 
> 
{ 
    output pixel4 result; 
     
    parameter float4 color 
    < 
        minValue:float4(0, 0, 0, 0); 
        maxValue:float4(1, 1, 1, 1); 
        defaultValue:float4(0, 0, 0, 1); 
    >; 
     
    void evaluatePixel() 
    { 
        result = color; 
    } 
}

Parametreleri belgelenmemiş bir gölgelendirici kullanıyorsanız, ShaderParameter nesnesinin type özelliğini kontrol ederek, dizide hangi tür öğelerden kaç tane bulunması gerektiğini öğrenebilirsiniz. type özelliği, gölgelendiricide tanımlandığı şekilde parametrenin veri türünü belirtir. Her parametre türünün beklediği öğelerin sayısını ve türünü belirten bir liste için, ActionScript 3.0 Başvurusundaki ShaderParameter.value özelliğine bakın.

Her ShaderParameter nesnesi aynı zamanda parametrenin gölgelendiricinin parametrelerinde hangi sırada olduğunu belirten bir index özelliğine de sahiptir. ShaderParameter nesnesi, bu özelliklere ek olarak, gölgelendiricinin yazarı tarafından sağlanan meta veri değerlerini içeren ek özelliklere de sahip olabilir. Örneğin, yazar bir parametre için minimum, maksimum ve varsayılan değerler gibi meta veri değerleri belirtebilir. Yazarın belirttiği tüm meta veri değerleri, dinamik özellikler olarak ShaderParameter nesnesine eklenir. Bu özellikleri incelemek için, for..in döngüsünü kullanarak, ShaderParameter nesnesinin dinamik özellikleri üzerinde döngü uygulayarak nesnenin meta verilerini tanımlayın. Aşağıdaki örnek, for..in döngüsünün nasıl bir ShaderParameter nesnesinin meta verisini tanımlamak için kullanıldığını gösterir. Her meta veri değeri, metadata adındaki bir Vector örneğine eklenir. Bu örnekte, myShader adında bir Shader örneğinin önceden oluşturulduğu ve bunun brightness adında bir parametreye sahip olduğunun varsayıldığını unutmayın:

var brightness:ShaderParameter = myShader.data.brightness; 
var metadata:Vector.<String> = new Vector.<String>(); 
 
for (var prop:String in brightness) 
{ 
    if (brightness[prop] is String) 
    { 
        metadata[metadata.length] = brightness[prop]; 
    } 
} 
 
// do something with the metadata