Gölgelendiriciyi harmanlama modu olarak kullanmaFlash 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:
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.
|
|