Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:53

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Bitmap mit schwarzer Farbe zeichnen
BeitragVerfasst: Mo Feb 11, 2008 16:09 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 17, 2007 14:35
Beiträge: 28
Hi!

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 11, 2008 16:48 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 11, 2008 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 17, 2007 14:35
Beiträge: 28
Danke, das werde ich mal probieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 11, 2008 17:06 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 11, 2008 18:00 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 17, 2007 14:35
Beiträge: 28
Lord Horazont hat geschrieben:
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 :wink: .


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 11, 2008 19:39 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 17, 2007 14:35
Beiträge: 28
Okay, er liest jetzt Graustufen TGAs ein.

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 11, 2008 21:44 
Offline
DGL Member
Benutzeravatar

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:
  1. blah := TglBitmap2D.Create;
  2. blah.LoadFromFile(...);
  3. blah.InternalFormat := ifAlpha;
  4. blah.GenTexture();


PS: Im Zweife häng das nächste mal bitte einfach das Rohbild an.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 12, 2008 12:51 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Nov 17, 2007 14:35
Beiträge: 28
Lossy eX hat geschrieben:
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 :wink:.

Danke nochmal.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 6 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]