Gölgelendiriciyi harmanlama modu olarak kullanma

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

Gölgelendiricinin harmanlama modu olarak kullanılması, diğer harmanlama modlarının kullanılmasına benzer. Gölgelendirici, görsel olarak birbiriyle harmanlanmış iki görüntüleme nesnesinin oluşturduğu görünümü tanımlar. Gölgelendiriciyi harmanlama modu olarak kullanmak için, Shader nesnenizi ön plan görüntüleme nesnesinin blendShader özelliğine atayın. blendShader özelliğine null dışında bir değer atanması, görüntüleme nesnesinin blendMode özelliğini otomatik şekilde BlendMode.SHADER olarak ayarlar. Aşağıdaki listede bir gölgelendiricinin harmanlama modu olarak kullanılması gösterilmektedir. Bu örnekte, foreground öğesinin diğer içeriklerin üzerine geldiğinin ve görüntüleme listesinde diğer görüntüleme içerikleriyle aynı üst öğede bulunan foreground adında bir görüntüleme nesnesi olduğunun varsayıldığını unutmayın:

foreground.blendShader = myShader;

Gölgelendiriciyi harmanlama modu olarak kullandığınızda, gölgelendiricinin en az iki girdiyle tanımlanması gerekir. Örnekte gösterildiği gibi, girdi değerlerini kodunuzda ayarlamazsınız. Bunun yerine, iki harmanlanmış görüntü otomatik şekilde gölgelendirici girdisi olarak kullanılır. Ön plan görüntüsü ikinci görüntü olarak ayarlanır. (Bu, harmanlama modunun uygulandığı görüntüleme nesnesidir.) Ön plan görüntüsünün sınırlama kutusunun arkasındaki tüm piksellerin bileşiği alınarak bir arka plan görüntüsü oluşturulur. Arka plan görüntüsü, birinci girdi görüntüsü olarak ayarlanır. İkiden çok girdi bekleyen bir gölgelendirici kullanırsanız, bu iki girdi dışındaki tüm girdiler için bir değer sağlamanız gerekir.

Aşağıdaki örnekte bir gölgelendiricinin harmanlama modu olarak kullanılması gösterilmektedir. Bu örnek, renk parlaklığını esas alarak açık bir harmanlama modu kullanır. Harmanlama sonucunda, harmanlanan nesnelerin herhangi birindeki en açık piksel değeri, görüntülenen piksel olur.

Not: Bu örneğin kodu Mario Klingemann tarafından yazılmıştır. Bu örneği bizimle paylaştığı için Mario'ya teşekkür ediyoruz. Şu adreste Mario’nun çalışmalarını görebilir ve yazılarını okuyabilirsiniz www.quasimondo.com .

Bu iki örnekte önemli ActionScript kodu bulunur:

  • init() : Uygulama yüklendiğinde init() yöntemi çağrılır. Bu yöntemde kod, gölgelendirici bayt kodu dosyasını yükler.

  • onLoadComplete() : onLoadComplete() yönteminde kod, shader adında bir Shader nesnesi oluşturur. Daha sonra üç nesne çizer. Bunlardan ilki olan backdrop , harmanlanmış nesnelerin arkasında bulunan koyu gri bir arka plandır. İkincisi olan backgroundShape , yeşil degrade elipstir. Üçüncü nesne olan foregroundShape ise turuncu degrade elipstir.

    foregroundShape elips, harmanlamanın ön plan nesnesidir. Harmanlamanın arka plan görüntüsünün bir bölümünü backdrop öğesinin bir parçası ve bir bölümünü de üstüne foregroundShape nesnesinin sınırlama kutusu gelen backgroundShape öğesinin bir parçası oluşturur. foregroundShape nesnesi, görüntüleme listesinde en öndeki nesnedir. Bu kısmen backgroundShape öğesinin ve tamamen backdrop öğesinin üzerine gelir. Bu üst üste gelme nedeniyle, harmanlama modu uygulanmadan turuncu elips ( foregroundShape ) tamamen gösterilirken, yeşil elipsin ( backgroundShape ) bir kısmı gizlenir:

    Ancak harmanlama modu uygulandığında, yeşil elipsin açık renkli kısmı, üzerini örten foregroundShape bölümünden daha açık olduğundan "saydam olarak" görünür:

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.BlendMode; 
    import flash.display.GradientType; 
    import flash.display.Graphics; 
    import flash.display.Shader; 
    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.geom.Matrix; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.URLRequest; 
     
    public class LumaLighten extends Sprite 
    { 
        private var shader:Shader; 
        private var loader:URLLoader; 
         
        public function LumaLighten() 
        { 
            init(); 
        } 
         
        private function init():void 
        { 
            loader = new URLLoader(); 
            loader.dataFormat = URLLoaderDataFormat.BINARY; 
            loader.addEventListener(Event.COMPLETE, onLoadComplete); 
            loader.load(new URLRequest("LumaLighten.pbj")); 
        } 
         
         
        private function onLoadComplete(event:Event):void 
        { 
            shader = new Shader(loader.data); 
             
            var backdrop:Shape = new Shape(); 
            var g0:Graphics = backdrop.graphics; 
            g0.beginFill(0x303030); 
            g0.drawRect(0, 0, 400, 200); 
            g0.endFill(); 
            addChild(backdrop); 
             
            var backgroundShape:Shape = new Shape(); 
            var g1:Graphics = backgroundShape.graphics; 
            var c1:Array = [0x336600, 0x80ff00]; 
            var a1:Array = [255, 255]; 
            var r1:Array = [100, 255]; 
            var m1:Matrix = new Matrix(); 
            m1.createGradientBox(300, 200); 
            g1.beginGradientFill(GradientType.LINEAR, c1, a1, r1, m1); 
            g1.drawEllipse(0, 0, 300, 200); 
            g1.endFill(); 
            addChild(backgroundShape); 
             
            var foregroundShape:Shape = new Shape(); 
            var g2:Graphics = foregroundShape.graphics; 
            var c2:Array = [0xff8000, 0x663300]; 
            var a2:Array = [255, 255]; 
            var r2:Array = [100, 255]; 
            var m2:Matrix = new Matrix(); 
            m2.createGradientBox(300, 200); 
            g2.beginGradientFill(GradientType.LINEAR, c2, a2, r2, m2); 
            g2.drawEllipse(100, 0, 300, 200); 
            g2.endFill(); 
            addChild(foregroundShape); 
             
            foregroundShape.blendShader = shader; 
            foregroundShape.blendMode = BlendMode.SHADER; 
        } 
    } 
}

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

<languageVersion : 1.0;> 
kernel LumaLighten 
< 
    namespace : "com.quasimondo.blendModes"; 
    vendor : "Quasimondo.com"; 
    version : 1; 
    description : "Luminance based lighten blend mode"; 
> 
{ 
    input image4 background; 
    input image4 foreground; 
 
    output pixel4 dst; 
     
    const float3 LUMA = float3(0.212671, 0.715160, 0.072169); 
 
    void evaluatePixel() 
    { 
        float4 a = sampleNearest(foreground, outCoord()); 
        float4 b = sampleNearest(background, outCoord()); 
        float luma_a = a.r * LUMA.r + a.g * LUMA.g + a.b * LUMA.b; 
        float luma_b = b.r * LUMA.r + b.g * LUMA.g + b.b * LUMA.b; 
         
        dst = luma_a > luma_b ? a : b; 
    } 
}

Harmanlama modlarını kullanma hakkında daha fazla bilgi için, bkz. Karışım modları uygulama .

Not: Pixel Bender gölgelendirici programı Flash Player'da veya AIR'de bir karışım olarak çalıştırıldığında, örnekleme ve outCoord() işlevleri, diğer bağlamlarda olduğundan daha farklı davranır. Bir karışımda örnekleme işlevi, her zaman gölgelendirici tarafından değerlendirilmekte olan geçerli pikseli geri döndürür. Örneğin komşu bir pikseli örneklemek için outCoord() işlevine bir uzaklık eklenemez. Aynı şekilde, outCoord() işlevini örnekleme dışında bir işlev için kullanırsanız, koordinatları her zaman 0 olarak değerlendirilir. Örneğin karıştırılan görüntülerin birleştirilme şeklini etkilemek için bir pikselin konumunu kullanamazsınız.