Çizim dolgusu oluşturmak için bir gölgelendirici kullandığınızda, vektör şekli oluşturmak için çizim api'si yöntemlerini kullanırsınız. Herhangi bir bitmap görüntüsünün, çizim api'si ile bitmap dolgusu olarak kullanılabilmesinde olduğu gibi, şekli doldurmak için gölgelendiricinin çıktısı kullanılır. Gölgelendirici dolgusu oluşturmak için, kodunuzda şekli çizmeye başlamak istediğiniz noktada, Graphics nesnesinin
beginShaderFill()
yöntemini çağırın. Bu listede gösterildiği gibi,
beginShaderFill()
yöntemine birinci argüman olarak Shader nesnesini iletin:
var canvas:Sprite = new Sprite();
canvas.graphics.beginShaderFill(myShader);
canvas.graphics.drawRect(10, 10, 150, 150);
canvas.graphics.endFill();
// add canvas to the display list to see the result
Bir gölgelendiriciyi çizim dolgusu olarak kullandığınızda, gölgelendiricinin gerektirdiği herhangi bir girdi görüntüsü değerini ve parametre değerini ayarlarsınız.
Şu örnek, gölgelendiricinin çizim dolgusu olarak kullanılmasını göstermektedir. Bu örnekte gölgelendirici üç noktalı degrade oluşturur. Bu degrade, renklerin her biri üçgenin bir ucunda ve aralarında degrade olacak şekilde üç renk içerir. Ayrıca, renkler animasyon uygulanmış dönen renk efekti oluşturmak için döner.
Not:
Bu örneğin kodu Petri Leskinen tarafından yazılmıştır. Bu örneği bizimle paylaştığı için Petri'ye teşekkür ediyoruz. Petri'nin örneklerinin ve öğreticilerinin daha fazlasını
http://pixelero.wordpress.com
adresinde görebilirsiniz.
ActionScript kodu üç moddadır:
-
init()
: Uygulama yüklendiğinde
init()
yöntemi çağrılır. Bu yöntemde kod, üçgenin noktalarını temsil eden Point nesnelerinin başlangıç değerlerini ayarlar. Ayrıca, kod
canvas
adında bir Sprite örneği oluşturur. Daha sonra
updateShaderFill()
yönteminde kod her kare için bir defa gölgelendirici sonucunu
canvas
öğesine çizer. Son olarak kod, gölgelendirici bayt kodu dosyasını yükler.
-
onLoadComplete()
:
onLoadComplete()
yönteminde kod,
shader
adında bir Shader nesnesi oluşturur. Ayrıca başlangıç parametre değerlerini ayarlar. Son olarak kod,
enterFrame
olayının dinleyicisi olarak
updateShaderFill()
yöntemini ekler, bu animasyon efekti oluşturmak için her kare için bir defa bu yöntemi çağırdığı anlamına gelir.
-
updateShaderFill()
: Her kare için birer kere
updateShaderFill()
yöntemi çağrılarak animasyon efekti oluşturulur. Bu yöntemde kod, gölgelendirici parametrelerinin değerlerini hesaplar ve ayarlar. Daha sonra kod, gölgelendirici dolgusu oluşturmak için
beginShaderFill()
yöntemini çağırır ve gölgelendirici sonucunu bir üçgende çizmek için başka çizim api'si yöntemlerini çağırır.
Aşağıda, bu örneğin ActionScript kodu verilmiştir. Flex'te yalnızca ActionScript projesi için ana uygulama sınıfı olarak veya Flash geliştirme aracındaki bir FLA dosyasının belge sınıfı olarak bu sınıfı kullanın:
package
{
import flash.display.Shader;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Point;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
public class ThreePointGradient extends Sprite
{
private var canvas:Sprite;
private var shader:Shader;
private var loader:URLLoader;
private var topMiddle:Point;
private var bottomLeft:Point;
private var bottomRight:Point;
private var colorAngle:Number = 0.0;
private const d120:Number = 120 / 180 * Math.PI; // 120 degrees in radians
public function ThreePointGradient()
{
init();
}
private function init():void
{
canvas = new Sprite();
addChild(canvas);
var size:int = 400;
topMiddle = new Point(size / 2, 10);
bottomLeft = new Point(0, size - 10);
bottomRight = new Point(size, size - 10);
loader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, onLoadComplete);
loader.load(new URLRequest("ThreePointGradient.pbj"));
}
private function onLoadComplete(event:Event):void
{
shader = new Shader(loader.data);
shader.data.point1.value = [topMiddle.x, topMiddle.y];
shader.data.point2.value = [bottomLeft.x, bottomLeft.y];
shader.data.point3.value = [bottomRight.x, bottomRight.y];
addEventListener(Event.ENTER_FRAME, updateShaderFill);
}
private function updateShaderFill(event:Event):void
{
colorAngle += .06;
var c1:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle);
var c2:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle + d120);
var c3:Number = 1 / 3 + 2 / 3 * Math.cos(colorAngle - d120);
shader.data.color1.value = [c1, c2, c3, 1.0];
shader.data.color2.value = [c3, c1, c2, 1.0];
shader.data.color3.value = [c2, c3, c1, 1.0];
canvas.graphics.clear();
canvas.graphics.beginShaderFill(shader);
canvas.graphics.moveTo(topMiddle.x, topMiddle.y);
canvas.graphics.lineTo(bottomLeft.x, bottomLeft.y);
canvas.graphics.lineTo(bottomRight.x, bottomLeft.y);
canvas.graphics.endFill();
}
}
}
Aşağıda, “ThreePointGradient.pbj” Pixel Bender bayt kodu dosyasını oluşturmak için kullanılan, ThreePointGradient gölgelendirici çekirdeğinin kaynak kodu verilmiştir:
<languageVersion : 1.0;>
kernel ThreePointGradient
<
namespace : "Petri Leskinen::Example";
vendor : "Petri Leskinen";
version : 1;
description : "Creates a gradient fill using three specified points and colors.";
>
{
parameter float2 point1 // coordinates of the first point
<
minValue:float2(0, 0);
maxValue:float2(4000, 4000);
defaultValue:float2(0, 0);
>;
parameter float4 color1 // color at the first point, opaque red by default
<
defaultValue:float4(1.0, 0.0, 0.0, 1.0);
>;
parameter float2 point2 // coordinates of the second point
<
minValue:float2(0, 0);
maxValue:float2(4000, 4000);
defaultValue:float2(0, 500);
>;
parameter float4 color2 // color at the second point, opaque green by default
<
defaultValue:float4(0.0, 1.0, 0.0, 1.0);
>;
parameter float2 point3 // coordinates of the third point
<
minValue:float2(0, 0);
maxValue:float2(4000, 4000);
defaultValue:float2(0, 500);
>;
parameter float4 color3 // color at the third point, opaque blue by default
<
defaultValue:float4(0.0, 0.0, 1.0, 1.0);
>;
output pixel4 dst;
void evaluatePixel()
{
float2 d2 = point2 - point1;
float2 d3 = point3 - point1;
// transformation to a new coordinate system
// transforms point 1 to origin, point2 to (1, 0), and point3 to (0, 1)
float2x2 mtrx = float2x2(d3.y, -d2.y, -d3.x, d2.x) / (d2.x * d3.y - d3.x * d2.y);
float2 pNew = mtrx * (outCoord() - point1);
// repeat the edge colors on the outside
pNew.xy = clamp(pNew.xy, 0.0, 1.0); // set the range to 0.0 ... 1.0
// interpolating the output color or alpha value
dst = mix(mix(color1, color2, pNew.x), color3, pNew.y);
}
}
Not:
Grafik işleme birimi (GPU) altında görüntü oluştururken bir gölgelendirici dolgusu kullanırsa doldurulan alanın rengi cam göbeği olur.
Çizim api'sini kullanarak şekil çizme hakkında daha fazla bilgi için, bkz.
Çizim API'sini kullanma
.