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

Aktuelle Zeit: So Jul 06, 2025 05:03

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Alpha-Blending und SDL_ttf
BeitragVerfasst: Sa Nov 12, 2011 17:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Hey,

ich weiß dass es schon zigtausende threads zu diesem Thema gibt, aber ich habe immer noch keine Lösung für mein Problem.

Mein Problem ist Folgendes: Ich bastel mir gerade eine kleine GUI zusammen und scheitere gerade kläglich an den Labels.
Diese sind eigentlich nur texturierte Quads. Die Textur bekomme ich mit passendem Alphakanal von SDL_ttf ( TTF_RenderText_Blended(...) ).
Nun möchte niemand hinter dem Text einen schwarzen Kasten sehen. Deshalb "blende ich diesen weg".
Aber meine BlendFunc bewirkt, dass der Text auf weißem Hintergrund auch weiß wird (Nennt sich das dann additives Blending?).
Ich finde aber keine andere BlendFunc welche das macht was ich mir vorstelle (habe auch schon das Wiki, das Forum und Google sonstwieoft durchsucht).

Meine derzeitige Blendfunc:
Code:
  1. glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);


Ich habe zur Veranschaulichung auch noch ein Bild angehängt.

Ich hoffe mir kann irgendjemand helfen.

Schonmal Danke im Voraus!

Chapter


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: Sa Nov 12, 2011 18:52 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Probier mal das hier:
Code:
  1. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
(Habe es nicht selbst probiert.)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: Sa Nov 12, 2011 19:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Ja die Kombination hatte ich auch schon probiert.
Da sind dann leider alle Labels weg.
Aber trotzdem danke erstmal.

Im Prinzip möchte ich ja nur eine Art Alphatest, der dafür sorgt, dass die Farbe der Schrift einmal über alles andere gerendert wird, ohne auf die Hintergrundfarbe zu achten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: Sa Nov 12, 2011 20:03 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Zeichnest du auch in der richtigen Reihenfolge? Also erst den Hintergrund (ohne Blending) und dann die Labels (mit Blending). Erinnert mich nämlich sehr an diesen Thread.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: Sa Nov 12, 2011 20:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Yep. Ich zeichne erst das Quad im Hintergrund mit seiner Textur und anschließend die Labels.

Ungefähr so:

Pseudocode:
Code:
  1.  
  2.     glClearColor( ... );
  3.     glClear( ... );
  4.  
  5.     //Hintergrund
  6.     glBindTexture( ... );
  7.     glBegin(GL_QUADS);
  8.        [UV Koordinaten und Vertices]
  9.     glEnd();
  10.  
  11.     //Label
  12.     glBindTexture( ... );
  13.     glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
  14.     glEnable(GL_BLEND);
  15.     glBegin(GL_QUADS);
  16.        [UV Koordinaten und Vertices]
  17.     glEnd();
  18.     glDisable(GL_BLEND);
  19.  


Ist jetzt aber nur das Wesentlichste. Eigentlich sind das alles Klassen und ich kann nicht den ganzen Code hier rein kopieren.

Danke für den Thread! Ich werde ihn mir nochmal genauer durchlesen aber eigentlich kenne ich den auch schon.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: So Nov 13, 2011 13:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); ist eigentlich genau, was du willst. Haben die Labels denn Alpha-Informationen? Womit renderst du sie (also welche sdl_ttf-Funktion)? TTF_RenderUTF8_Blended sollte die richtige sein. Kopierst du den Alpha-Kanal auch richtig in die Textur? Hast du mit glColor4f eventuell ne 0 auf den Alpha-Kanal gesetzt?

greetings

_________________
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: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: So Nov 13, 2011 15:17 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Also Ich rendere mit TTF_RenderText_Blended(), aber TTF_RenderUTF8_Blended() bringt so weit ich das sehen kann keinen Unterschied.

Warum Alphakanal kopieren? Woher?
Das SDL_Surface hat doch automatisch einen Alphakanal wenn ich es mit TTF_RenderText_Blended()/TTF_RenderUTF8_Blended() erzeugt habe.
Oder muss ich da noch was bei der Konvertierung zur OpenGL Textur beachten außer den siebenten Parameter bei glTexImage2D() auf GL_BGRA bzw. GL_RGBA zu setzen :shock: ?

In Sachen Blending/Alpha fühle ich mich immer noch so ahnungslos, trotz aller Tut's etc. die ich durchgeackert habe. *selbstzweifel*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: So Nov 13, 2011 16:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ne, GL_RGBA/BGRA sieht schonmal gut aus. Kannst du den Code zur Erstellung der Textur nochmal pasten? Denn soweit ich das sehe, sollte es so funktionieren.

greetings

_________________
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: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: So Nov 13, 2011 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Natürlich kann ich den Code reinstellen ;).

Mein Code der die Font rentert und die Textur daraus erstellt:

Code:
  1.  
  2.     SDL_Surface* text;
  3.     text = TTF_RenderUTF8_Blended(font, caption, color);
  4.     w = text->w;
  5.     h = text->h;
  6.  
  7.     SDL_Surface * temp = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); //So sollte unten zwar GL_RGBA stehen aber dann sind Rot und Blau vertauscht
  8.  
  9.     SDL_BlitSurface(text, 0, temp, 0);
  10.  
  11.     glEnable(GL_TEXTURE_2D);
  12.  
  13.     glGenTextures(1, &tex);
  14.     glBindTexture(GL_TEXTURE_2D, tex);
  15.  
  16.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  17.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  18.  
  19.     glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h,0, GL_BGRA, GL_UNSIGNED_BYTE, temp->pixels); //GL_RGBA -> GL_BGRA Dreher!
  20.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: So Nov 13, 2011 17:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Mit dem SDL_CreateRGBSurface-Aufruf müsstest du GL_ARGB machen. Versuchs mal so:
Code:
  1.     SDL_Surface * temp = SDL_CreateRGBSurface(0, w, h, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);


und dann GL_RGBA an glTexImage2D.

greetings

_________________
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: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: So Nov 13, 2011 19:49 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Sehr schön!

Tausend Dank Lord! Ich sehe das erste mal seit Tagen wieder Licht im Dunkeln :D .

Aber ein Problem ist dadurch neu entstanden.
Mir fehlt jetzt eine Farbkomponente.

Zur Erklärung:
Ich befülle die Variable "color" vom Typ "SDL_Color".
Code:
  1.  
  2. color.r := 255;
  3. color.g := 255;
  4. color.b := 255;
  5. color.unused := 255;
  6.  

Nun müsste meiner Ansicht nach die Schrift 100% deckend (weil unused = 255) und weiß sein.
Aber sie ist gelb weil "r" nun für den Alphawert, "g" für den Rot-Wert und "b" für den Grün-Wert zuständig ist.
"unused" müsste nun eigentlich das Blau steuern aber es wird unterschlagen.

Dadurch kann ich meine Schriftzüge weder bläulich noch weiß gestalten.

Deshalb hatte ich vorher die Hexzahlen umgedreht. Dann habe ich aber wieder keinen Alphakanal. Es ist wie ein Teufelskreis!
Es kommt mir so vor als würde irgendwas nur mit 24 BitsPerWasauchimmer arbeiten (je 8 für jede Farbe) und so den Alphakanal oder wahlweise eine Farbe wegschneiden.
Aber Ich habe meinen Context extra auf 32 BPP gesetzt (sonst nehm ich aus macht der Gewohnheit immer 24 BPP) und mit SDL_GL_SetAttribute() Red, Green ,Blue, und Alpha auf 8 Bit gesetzt.

Chapter


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: Mo Nov 14, 2011 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
So mach ich das:
Code:
  1.  
  2. var
  3.   SavedFlags: UInt32;
  4.   SavedAlpha: UInt8;
  5.   FinalSurface: PSDL_Surface;
  6. // […]
  7.     TextSurface := TTF_RenderUTF8_Blended(AFont, @Text[1], White);
  8.     // […]
  9.     FinalSurface := SDL_CreateRGBSurface(
  10.       SDL_SWSurface,
  11.       NewW,
  12.       NewH,
  13.       32,
  14.       $000000FF,
  15.       $0000FF00,
  16.       $00FF0000,
  17.       $FF000000
  18.     );
  19.     SavedFlags := TextSurface^.flags and (SDL_SRCALPHA or SDL_RLEACCELOK); 
  20.     SavedAlpha := TextSurface^.format^.alpha;
  21.     if ((SavedFlags and SDL_SRCALPHA) = SDL_SRCALPHA) then
  22.       SDL_SetAlpha(TextSurface, 0, 0);
  23.  
  24.     SDL_BlitSurface(TextSurface, 0, FinalSurface, 0);
  25.  
  26.     if ((SavedFlags and SDL_SRCALPHA) = SDL_SRCALPHA) then 
  27.       SDL_SetAlpha(TextSurface, SavedFlags, SavedAlpha);
  28.  
  29.     // […]
  30.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FinalSurface^.w, FinalSurface^.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, FinalSurface^.pixels);
  31.  

(aus unterschiedlichen Dingen zusammenkopiert, hoffe, dass ich die Bezeichner konsistent bekommen habe)
NewW und NewH führe ich ein, weil ich die Surface auf die nächste zweierpotenz vergrößere. Dieses SetAlpha-Zeug war glaube ich für Dinge relevant, wo der Alphakanal nicht vorhanden war… Egal, probiers trotzdem mal aus.

Übrigens brauchst du nur Weiß für deinen Text. Es ist effizienter, wenn du den Rest über glColor4f erledigst ;)

grüße
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: Re: Alpha-Blending und SDL_ttf
BeitragVerfasst: Mo Nov 14, 2011 21:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Ah...Hm.. da warst du jetzt ein Stück schneller.

Ich hab's jetzt vor zehn Minuten selbst hinbekommen und wollte feierlich verkünden, dass ich endlich durch die Materie durchgestiegen bin (vorerst :mrgreen: ).

Da war ich wohl zu langsam. Aber so war wenigstens der Lerneffekt da.

Also ich kann mich nur nochmal bedanken für die schnelle Hilfe.

greetings
Chapter


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 27 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.009s | 14 Queries | GZIP : On ]