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

Aktuelle Zeit: Fr Jul 18, 2025 16:44

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



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: SDL-Text transparent rendern
BeitragVerfasst: So Feb 18, 2007 17:33 
Offline
DGL Member

Registriert: Sa Feb 03, 2007 11:10
Beiträge: 26
Wohnort: Dingolfing
Morgen.

Ich versuche gerade, Text per SDL_RenderText_Blended auf eine Surface zu rendern, die Surface auf 2^n*2^n zu vergrößern, das als Textur zu nehmen und dann die Textur auf ein Quad zu legen. Da, wo keine Schrift ist, soll das ganze komplett transparent sein.

Momentan sieht mein Ansatz so aus:

Code:
  1. var Surface1, Surface2: PSDL_Surface;
  2. begin
  3.   Surface2:=TTF_RenderText_Blended(
  4.       FFont.FontID, 'wuppdi', FFont.SDLColor);
  5.   FTexWidth:=64;
  6.   FTexHeight:=64;
  7.   Surface1:=SDL_CreateRGBSurface(SDL_SWSURFACE,
  8.       FTexWidth, FTexHeight, 32, $FF, $FF00, $FF0000, $FF000000);
  9.   SDL_SetAlpha(Surface1, 0, 255);
  10.   SDL_BlitSurface(Surface2, nil, Surface1, nil);
  11.   SDL_LockSurface(Surface1);
  12.   glBindTexture(GL_TEXTURE_2D, FTexID);
  13.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  14.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  15.   glTexImage2D(GL_TEXTURE_2D, 0, 4, Surface1.w, Surface1.h, 0, GL_RGBA,
  16.       GL_UNSIGNED_BYTE, Surface1.pixels);
  17.   SDL_FreeSurface(Surface1);
  18.   SDL_FreeSurface(Surface2);  
  19. end;


Die Textur wird angezeigt, das passt. Aber sie ist nicht transparent. Darum versuche ich jetzt, zu blenden:

Aber welche BlendFunc soll ich nehmen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 19, 2007 09:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die typische Blendfunc um etwas über etwas anderes zu blenden ist folgende.
Code:
  1.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Nicht vergessen das Blending dann noch zu aktivieren.

PS: Rufst du den obenstehenden Code bei jedem Frame/Text auf?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 19, 2007 10:10 
Offline
DGL Member

Registriert: Sa Feb 03, 2007 11:10
Beiträge: 26
Wohnort: Dingolfing
Nein, nur wenn sich der Text ändert.

EDIT: Nein, das wars nicht. Jetzt sind meine Textquads tiefschwarz und auch nicht durchsichtig.


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

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie zeichnest du denn dein Quad?

Bzw habe ich gerade mal in die Definition von SDL_SetAlpha geschaut und wenn Flag 0 ist dann ist Alphablending deaktiviert. Keine Ahnung ob es damit etwas zu tun hat. Probier mal wie es mit SDL_SRCALPHA ausshaut.

Bin leider nicht ganz so der Krack was die ganzen Surface geschichten angeht. Mache das meistens alles per Hand.

PS: Evtl wäre für dich auch Textur Rectangle ganz interessant. Das ist eine Extension bei der man Texturen benutzen kann deren Größe keine Potenz von 2 hat. Somit könntest du dir zum Beispiel das Umkopieren sparen und würdest so Zeit und Platz einsparen können. Das einzige was du machen müsstest wäre ein anderes Texturtarget GL_TEXTURE_RECTANGLE_ARB und die Texturkoordinaten wären nicht mehr auf 1 Normiert sondern wären angaben der Breite und Höhe. Also in Pixeln.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 19, 2007 14:02 
Offline
DGL Member

Registriert: Sa Feb 03, 2007 11:10
Beiträge: 26
Wohnort: Dingolfing
Code:
  1.   glEnable(GL_BLEND);
  2.   glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  3.   glEnable(GL_TEXTURE_2D);
  4.   glColor3f(1, 1, 1);
  5.   glBindTexture(GL_TEXTURE_2D, FTexID);
  6.   glBegin(GL_QUADS);
  7.   glTexCoord2f(0, 0);
  8.   glVertex3f(FX, FY, FZ-1);
  9.   glTexCoord2f(0, 8/FTexHeight*FHeight);
  10.   glVertex3f(FX, FY+FHeight, FZ-1);
  11.   glTexCoord2f(8/FTexWidth*FWidth, 8/FTexHeight*FHeight);
  12.   glVertex3f(FX+FWidth, FY+FHeight, FZ-1);
  13.   glTexCoord2f(8/FTexWidth*FWidth, 0);
  14.   glVertex3f(FX+FWidth, FY, FZ-1);
  15.   glEnd;
  16.   glDisable(GL_BLEND);


So wird das Quad gerendert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 19, 2007 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also mit
Code:
  1. glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

sehe ich auch nur schwarz.

Versuch es mal mit.
Code:
  1. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


Wenn die Textur richtig erstellt wurde und die Daten der Textur stimmen dann sollte es richtig aussehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 19, 2007 18:18 
Offline
DGL Member

Registriert: Sa Feb 03, 2007 11:10
Beiträge: 26
Wohnort: Dingolfing
Dann sehe ich gar nichts. Also praktisch das ganze Label transparent.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 21, 2007 23:49 
Offline
DGL Member

Registriert: Sa Feb 03, 2007 11:10
Beiträge: 26
Wohnort: Dingolfing
*push*


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 22, 2007 09:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich kann mir jetzt so nicht ausmalen wo das Problem liegen könnte. Aber ich würde dich mal bitten packe mal dein Projekt und schicke es mir einmal per Mail "lossy AT delphigl.com". Dann schaue ich mir das heute abend ein Mal komplett an. Sofern es nicht zu groß ist oder irgendwelche wichtigen Daten beinhält. Wichtig dabei aber bitte alle benötigten Daten mit dazu packen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 22, 2007 11:17 
Offline
DGL Member

Registriert: Sa Feb 03, 2007 11:10
Beiträge: 26
Wohnort: Dingolfing
4000 LOC, soll beim PGD eingereicht werden...

Mal schauen, ich werd versuchen, es so weit wie möglich abzuspecken und dann dir zu schicken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 22, 2007 11:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dann müssen wir aufpassen, dass Sascha das nicht ließt. :twisted:

Du kannst ja den entsprechenden Code in ein leeres Projekt auslagern. Wenn der Fehler dann immer noch besteht macht es die Sache ja auch nicht schwieriger zu finden.

[edit] Achja. Im DGL-SDK befindet sich auch eine Datei namens easySDLfont. Glaube ich. Die erstellt auch Fonts mit SDL. Auf Zeichenbasis. Evtl wäre das ja auch noch einen Blick wert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 22, 2007 11:46 
Offline
DGL Member

Registriert: Sa Feb 03, 2007 11:10
Beiträge: 26
Wohnort: Dingolfing
Ich denke mal, es sollte kein Problem sein, wenn ich in einem Forum nach Hilfe bei einem konkreten Problem frage. ;)

Das mit dem leeren Projekt ist eine sehr gute Idee, ich habe glücklicherweise das ganze sehr stark modularisiert. Mal schauen, was ich basteln kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 22, 2007 15:16 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Lossy eX hat geschrieben:
[edit] Achja. Im DGL-SDK befindet sich auch eine Datei namens easySDLfont. Glaube ich. Die erstellt auch Fonts mit SDL. Auf Zeichenbasis. Evtl wäre das ja auch noch einen Blick wert.

Da hätte ich jetzt auch drauf verwiesen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 22, 2007 20:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich habe mir die Quellen mal angeschaut und das Problem was du da hast ist, dass SDL_BlitSurface den Alphakanal verrechnet/wegschmeißt. Das darf aber nicht passieren. Entweder kopierst du das eben selber oder aber du benutzt derzeit wirklich die easySDL. Eine andere Alternative gibt es vorerst nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 22, 2007 21:10 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das mit dem Wegschmeissen wird ansich aber durch das SDL_SetAlpha verhindert, zumindest erfolgt der Aufruf davon mit dem Ziel dies zu verhindern.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.022s | 15 Queries | GZIP : On ]