Ich habe folgendes Bild: Bild 1 (Button.png) im Anhang.
Alle weißen Bereiche des Bildes will ich zeichnen, alle schwarzen nicht.
Das könnte ich mit glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR) erreichen.
Ich möchte allerdings die Farbe nicht weiß haben sondern schwarz (siehe Bild 2).
Bei dem Einsatz von glColor3f(0,0,0) wird mein Bild aber transparent.
Ich möchte aber das schwarz mit 100 % Sichtbarkeit.
Ich denke da muss ich der Funktion glBlendFunc andere Parameter übergeben, nur welche? Kann mir da jemand auf die Sprünge helfen?
Ich habe schon ein bisschen mit den Parametern herumgespielt, aber es mir nicht gelungen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
So wie du dir das vorstellst geht das nicht so ganz. Denn die Farbe der Textur und von glColor werden miteinander multipliziert und dann wird das Blending angewendet. Wenn du also eine Blendfunktion hast die auf Farbe reagiert wird grundsätzlich immer glColor mit einbezogen.
Die Lösung des Problemes ist aber einfacher als man glauben mag. Löse dich davon, dass deine Textur eine RGB(A) Textur sein muss. In deinem Falle soll die Textur ja nur als eine Art Maske dienen. Also wäre es das Einfachste sie auch so zu benutzen.
Dazu gehst du in dein Grafikprogramm und wandelst die Textur in Graustufen um. Es gibt direkt eine Option dafür. Bei GIMP Modus genannt. Dieses Bild kannst du ganz normal als PNG abspeichern und mit der glBitmap laden. Nach dem Laden und vor GenTexture musst du aber das Format der Texturdaten ändern. Dazu musst du die Eigenschaft InternalFormat auf ifAlpha setzen. Bei 8 Bit benutze ich normal ifLuminance was dafür sorgt, dass RGB jeweils die selben Werte bekommen. Aber es sind halt eben Farbwerte. Mit ifAlpha werden die Werte von OpenGL aber als Alpha interpretiert. Und existieren sozusagen paralell zu deinen Farbwerten.
Diese Textur bindest du auf deine Fläche und stellst via glColor eine Farbe ein und kannst dann mit GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA Teile des Quads ausblenden. Das QUAD hingegen ist aber mit der Farbe von glColor gefüllt.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hm... Wäre es nicht einfacher und frei von glBitmap (nichts gegen diese Bibliothek, aber sie ist nicht Plattformunabhängig), wenn man diese Graustufen einfach noch als zusätzlichen Alphakanal an die Bitmap hängt? Dann könnte man eine einfache glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) benutzen.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Hm... Wäre es nicht einfacher und frei von glBitmap (nichts gegen diese Bibliothek, aber sie ist nicht Plattformunabhängig), wenn man diese Graustufen einfach noch als zusätzlichen Alphakanal an die Bitmap hängt? Dann könnte man eine einfache glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) benutzen.
Gruß Lord Horazont
Das Problem ist, dass ich eigentlich nicht unbedingt die Ahnung habe, wie ich sowas mache. (Das dranhängen müsste zur Laufzeit passieren.)
Ich bin froh, dass ich das Tutorial von euch nach C++ (das lerne ich im Moment ) portieren konnte. (Das erste Mal, dass ich ein fremdes Dateiformat ausgelesen habe)
Unkomprimierte Graustufen TGAs haben den Typ 3. Und jetzt muss ich nur rausfinden welchem Format das entspricht. BGR kann es ja nicht mehr sein.
Aber ich schaue mir mal glBitmap.pas genauer an. Irgendwo da muss es ja alles versteckt sein .
Wenn man über die Unit glBitmap das InternalFormat ändern würde, würde es eine Auswirkung auf SelectFormat(...) haben, welche von GenTexture ausgeführt wird.
Ich habe bei mir glFormat auf GL_LUMINANCE_ALPHA gestellt und ich erkenne mein Bild wieder.
Du sagtest ich sollte ifLuminance nehmen. Ich habe also glFormat = GL_LUMINANCE und bei dem glInternalFormat war ich mir nicht sicher und habe rumprobiert.
Es kommt immer sowas wie im Anhang raus. Ich kann aber auch nicht erkennen, dass in glBitmap.pas irgendwo was umgewandelt wird.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ja bei Graustufen kannst du trotzdem noch einen Alphakanal haben. Das ist aber in dem Fall gar nicht nötig und könnte zu dem Problem führen, dass Luminance Alpha geht aber Alpha bzw Luminance nicht geht. Das Bild sieht auch so aus. Also Ein Streifen, Kein Streifen, Ein Streifen, Kein Streifen.
Also beim Erstellen der Textur einfach auf Graustufen stellen und Ebenenmasken etc. entfernen. Nur die Sichtbarkeit innerhalb des Bildes erstellen. Also das was normal die Farben sind.
Wenn du die Eigenschaft InternalFormat zuweist und ein Fehler erzeugt wird, dann hat das einen guten Grund. Denn bei der Zuweisung ändere ich nur die Bedeutung der Daten. Dazu müssen die Daten (Pixel) aber die gleiche Größe haben. Ansonsten geht das natürlich nicht.
Bei deinem Bild kannst du dir auch mal das InternalFormat anzeigen lassen. Da vermute ich mal steht so was drinn wie ifLuminanceAlpha. Und dann hast du noch einen "störenden" Alphakanal im Bild. Wenn du es geladen hast und wirklich nur eine Graustufen Ebene vorhanden war dann solltest du dort ifLuminance sehen.
Denn im Normalfall reicht folgender Code um ein Alphatextur zu erstellen.
Code:
blah := TglBitmap2D.Create;
blah.LoadFromFile(...);
blah.InternalFormat:= ifAlpha;
blah.GenTexture();
PS: Im Zweife häng das nächste mal bitte einfach das Rohbild an.
Bei deinem Bild kannst du dir auch mal das InternalFormat anzeigen lassen. Da vermute ich mal steht so was drinn wie ifLuminanceAlpha. Und dann hast du noch einen "störenden" Alphakanal im Bild. Wenn du es geladen hast und wirklich nur eine Graustufen Ebene vorhanden war dann solltest du dort ifLuminance sehen.
Genau das war es. In GIMP hatte es noch einen Kanal angezeigt. Als ich den entfernt hatte, hat es funktioniert.
Da hat ja die Glaskugel wieder bestens funktioniert .
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.