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).
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.
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.
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 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
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 ?
In Sachen Blending/Alpha fühle ich mich immer noch so ahnungslos, trotz aller Tut's etc. die ich durchgeackert habe. *selbstzweifel*
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 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
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:
SDL_Surface* text;
text = TTF_RenderUTF8_Blended(font, caption, color);
w = text->w;
h = text->h;
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
_________________ 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
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 .
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:
color.r := 255;
color.g := 255;
color.b := 255;
color.unused := 255;
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.
(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 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
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.