• Blackberry DevCon – Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-06-2010, 13:24   #1 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
PixelBender Problem Alpha beefinlusst Brightness

Aloha,

ich habe einen kleinen und eigentlich simplen PixelBender Kernel geschrieben, der allerdings ein merkwürdiges Verhalten zeigt. Weiss jemand Rat?

Gewünschte Funktion:
Versehe ein Bitmap "source" mit einem Alpha-Kanal, dessen Werte aus der Helligkeit eines Bitmaps "mask" entnommen werden.

Source:
HTML-Code:
<languageVersion : 1.0;>

kernel ApplyAlphaMask
<   namespace : "de.planneun";
    vendor : "leif"    
    version : 1;
    description : "creating an alpha channel out of a a greyscale mask";
>
{
    input image3 source;    // color image
    input image3 mask;      // alpha mask, where black results in alpha 1.0, white in 0.0
    
    output pixel4 dst;
    
    void evaluatePixel()
    {
        pixel3 maskColor = sampleNearest(mask, outCoord());
        pixel3 sourceColor = sampleNearest(source, outCoord());
         
        dst.rgb = sourceColor.rgb;
        dst.a = (maskColor.r + maskColor.g + maskColor.b) / 3.0;
    }
}
Hier mal das Ergebnis als Bild:

Links: Original Bitmap ("source")
Mitte: Alpha-Maske ("mask")
Rechts: Ergebnis nach Anwendung des Kernels vor Checkerboard-Hintergrund.

Nun also zur Preisfrage: Woher kommen die hellen "Randpixel" im Übergang von Figur und Hintergrund?
Als Farbe benutze ich ja "source", und hier kommen an den betreffenden Stellen keine so hellen Pixel vor. Als Alpha berechne ich einen Wert zwischen 0.0 und 1.0.. Zusammen sollte dies Zielpixel ergeben, die genau so hell wie in "source" sind und lediglich im Alpha-Wert abweichen.
Irgendwie scheint mir aber die Farbe der Alpha-Maske ins Ergebnis mit einzufliessen...?!
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Alt 11-06-2010, 18:22   #2 (permalink)
Neuer User
 
Registriert seit: Jun 2010
Beiträge: 20
Hat dein Source Image einen Alpha Kanal mit einem Wert > 0 ?

Falls ja, lies mal hier:

Custom blend modes for Flash 10 Lost In Actionscript – Shane McCartney

weiter unten "Tips for writing your own custom blend modes".

Sollte das nicht Dein Problem beschreiben, würde ich mal eine andere Filtermethode (alternativ zu nearest neighbour) testen um zu sehen ob das Ergebnis dadurch beeinflusst wird.

Geändert von desmo (11-06-2010 um 18:24 Uhr)
desmo ist offline   Mit Zitat antworten
Alt 11-06-2010, 18:58   #3 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
Jawoll, genau das war der Punkt. Bin eben vor bemerken Deiner Antwort hier über Deinen frischen Thread samt Link gestolpert und dadurch dann auch drauf gekommen. Dankeschön!

Richtig funktioniert der Kernel dann wie folgt:
HTML-Code:
<languageVersion : 1.0;>

kernel ApplyAlphaMask
<   namespace : "de.planneun";
    vendor : "leif";
    version : 1;
    description : "creating an alpha channel out of a a greyscale mask";
>
{
    input image4 source;    // color image
    input image4 mask;      // alpha mask, where black results in alpha 1.0, white in 0.0
    
    output pixel4 dst;
    
    void evaluatePixel()
    {
        pixel4 maskColor = sampleNearest(mask, outCoord());
        pixel4 sourceColor = sampleNearest(source, outCoord());
         
        if (maskColor.a > 0.0) 
        {
            maskColor.rgb *= (1.0 / maskColor.a);
        }
        if (sourceColor.a > 0.0) 
        {
            sourceColor.rgb *= (1.0 / sourceColor.a);
        }
        
        dst.a = (maskColor.r + maskColor.g + maskColor.b) / 3.0;
        dst.rgb = sourceColor.rgb * (1.0 * dst.a);
    }
}
}
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Alt 11-06-2010, 19:22   #4 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
... oder effektiver:
HTML-Code:
<languageVersion : 1.0;>

kernel ApplyAlphaMask
<   namespace : "de.planneun";
    vendor : "leif";
    version : 1;
    description : "creating an alpha channel out of a greyscale mask";
>
{
    input image3 source;    // color image
    input image3 mask;      // alpha mask, where black results in alpha 1.0, white in 0.0
    
    output pixel4 dst;
    
    void evaluatePixel()
    {
        pixel3 maskColor = sampleNearest(mask, outCoord());
        pixel3 sourceColor = sampleNearest(source, outCoord());
         
        dst.a = (maskColor.r + maskColor.g + maskColor.b) / 3.0;
        dst.rgb = sourceColor.rgb * (1.0 * dst.a);
    }
}
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Pixelbender Machbarkeitsfrage edding950 ActionScript 3 2 20-06-2009 17:53
tweener klasse: alpha und brightness gleichzeitig? _lem45 Flash CS3 Professional 7 10-06-2008 14:59
Alpha-Blending + Brightness? Smiller ActionScript 2 5 08-02-2007 13:01
performance problem bei Filter+ brightness script shinbo Flash 8 3 28-01-2007 11:53
problem mit brightness und colorobject artheist ActionScript 1 10 01-05-2004 00:35


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele