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

Aktuelle Zeit: Sa Jul 05, 2025 09:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 14 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Sep 17, 2011 08:48 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Hi,
ich beschäftige mich gerade mit SDL, und soweit ist auch alles klar, und läuft soweit. Nun habe ich mir eine einfache textausgabe zusammengeschrieben, welche auch funktioniert - nur die Qualität lässt sehr zu wünschen übrig und ich weiß nicht woran das liegt.

Hier der Code:
Code:
  1.  
  2. var pstext, psausgabe: PSDL_Surface;
  3.  
  4. //TTF initialisieren und Schrift einladen
  5. TTF_Init;
  6.  
  7. //Text in ein Surface rendern
  8. pstext := TTF_RenderText_Solid(font,pChar(text), color);
  9.  
  10. //Nächste Potenzen von 2 für das eigentliche Surface berechen
  11. w :=  NextPowerOfTwo(pstext.w);
  12. h :=  NextPowerOfTwo(pstext.h);
  13.  
  14. //Leeres Surface erstellen und gerenderten Text rüberkopieren
  15. psausgabe := SDL_CreateRGBSurface(SDL_SWSURFACE,w,h,32, rmask, gmask, bmask, amask);
  16. SDL_BlitSurface(pstext,0,psausgabe,0);
  17.  
  18. //Textur erstellen
  19. glGenTextures(1,@texture);
  20.  
  21. glBindTexture(GL_TEXTURE_2D, texture);
  22.  
  23. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  24. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  25.  
  26. glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA,
  27.                     GL_UNSIGNED_BYTE, psausgabe.pixels );
  28.  
  29.  
  30. //Texture an ein Quad binden und ausgeben
  31. glEnable(GL_TEXTURE_2D);
  32.  
  33. glColor4f(1,1,1,0);
  34.  
  35.  glBegin(GL_QUADS);
  36.    glTexCoord2f(0,0);  glVertex3f(location.x,     location.y+h  ,0);  
  37.    glTexCoord2f(0,1);  glVertex3f(location.y,     location.y      ,0);  
  38.    glTexCoord2f(1,1);  glVertex3f(location.x+w, location.y      ,0);
  39.    glTexCoord2f(1,0);  glVertex3f(location.x+w, location.y+h   ,0);
  40.  glEnd; 
  41.  
  42. //Alles freigeben
  43.  SDL_FreeSurface(pstext);
  44.  SDL_FreeSurface(psausgabe);
  45.  glDeleteTextures(1, @texture);
  46.  




Wie gesagt, es funktioniert auch alles.. Nur hier ist ein Bild mit der Ausgabe:
Bild


Das wäre hier zB die Schrift Arial mit "A Test"
Woran könnte diese schlechte Ausgabe liegen? Mein sdl_ttf.dll ist die Version 2.0.6

lg

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 17, 2011 10:03 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Du renderst es solid. Siehe http://wiki.delphigl.com/index.php/TTF_Rendermode

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 17, 2011 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Auch ist deine Schriftart recht klein für so ein RIESEN Quad. ;-)

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 17, 2011 21:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das Problem bei "Texture-Fonds" ist, dass sie schlecht skalieren.
Du benötigst mehrere Versionen in verschiedenen Größen. z.B. größe 8, 11 und 16. Dann kannst du vor dem Zeichnen, je nach gewünschter Größe die naheliegendste verwenden und diese dann vergrößern/verkleinern.
Außerdem fehlt noch Blending so wie es aussieht.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Sep 17, 2011 23:50 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Bei TTF handelt es sich doch um TrueTypeFont, da sind die Zeichen doch Vektorgrafiken.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 18, 2011 01:18 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Ja, bis du sie ausgibst. An der Stelle sind sie keine Vektoren mehr. Und wenn sie danach skaliert werden, was hier geschehen ist, ist der Effekt nicht positiv.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 18, 2011 13:11 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
i0n0s hat geschrieben:


Oh mann, okay, mit dem Link wirds klar. Aus der libsdl Doku geht das natürlich nicht hervor. Dort steht nur dass Text in ein Surface gerendert wird. Über Qualität steht da nix...


Zitat:
Außerdem fehlt noch Blending so wie es aussieht.

Jap, habe ich zu Testzwecken ausgeschaltet


Zitat:
Das Problem bei "Texture-Fonds" ist, dass sie schlecht skalieren.
Du benötigst mehrere Versionen in verschiedenen Größen. z.B. größe 8, 11 und 16. Dann kannst du vor dem Zeichnen, je nach gewünschter Größe die naheliegendste verwenden und diese dann vergrößern/verkleinern.

Zitat:
Auch ist deine Schriftart recht klein für so ein RIESEN Quad. ;-)

Zitat:
Ja, bis du sie ausgibst. An der Stelle sind sie keine Vektoren mehr. Und wenn sie danach skaliert werden, was hier geschehen ist, ist der Effekt nicht positiv.

Ich habe auch mal die Vergrößerung des Surface auf die nächste ZweierPotenz abgeschaltet und habe die Größe genommen die mir RenderSolid zurückgibt genommen. Genau der selbe Effekt. Das hat mich auch gewundert
Es kommt immer ein sehr großes Quad....


Wenn ich die Schriftart sehr groß setzte - z.b. größe 70 und dann das Quad entsprechend verkleiner, sieht es gut aus. Aber ich kann mir nicht vorstellen dass das so gewollt ist

lg

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 18, 2011 15:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Carmageddon hat geschrieben:
Oh mann, okay, mit dem Link wirds klar. Aus der libsdl Doku geht das natürlich nicht hervor. Dort steht nur dass Text in ein Surface gerendert wird. Über Qualität steht da nix...

Was steht denn bei deinem Link so...
Zitat:
This family of functions will render the given text with the given font with fg color onto a new surface. The Solid mode is used and this is the fastest.
Und "Solid" ist ein Link auf http://www.libsdl.org/cgi/docwiki.cgi/S ... ons/Render , wo so ziemlich das gleiche steht wie hinter i0n0s' Link... :roll:

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 18, 2011 20:33 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Okay, habe ich echt nicht gesehen..

Danke an euch, jetzt läufts so wies soll. :)

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 20, 2011 18:23 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Ich möchte deswegen keinen neuen Thread eröffnen, aber ich habe noch eine weitere Frage:

Ich versuche schon die letzten 2 Tage den Fehler zu finden. Im Grunde geht es um obrige Procedure welche einen Text in ein gluInt rendert. Diese Texture wird nun gespeichert und nur auf Abfruf gezeichnet:

Code:
  1. procedure TGUIStandartClass.SetCaption( newCaption: AnsiString );
  2. var initial,
  3.     intermediary: PSDL_Surface;
  4.     w,h: integer;
  5.     rmask, gmask, bmask, amask: Uint32;
  6. begin
  7.  initial := TTF_RenderText_Solid(font,pChar(newCaption), color);
  8.  
  9.  
  10.  w := NextPowerOfTwo(initial.w);
  11.  h := NextPowerOfTwo(initial.h);
  12.  
  13.  
  14.  intermediary := SDL_CreateRGBSurface(SDL_SWSURFACE,w,h,32, rmask, gmask, bmask, amask);
  15.  SDL_BlitSurface(initial,0,intermediary,0);
  16.  
  17.  
  18.   if glIsTexture(CaptionPic) then
  19.   glDeleteTexture(1,@CaptionPic);
  20.  
  21. glGenTextures(1,@CaptionPic)
  22.  
  23.   glBindTexture(GL_TEXTURE_2D, CaptionPic);
  24.  
  25.  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  26.  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  27.  
  28.  
  29.  glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA,
  30.             GL_UNSIGNED_BYTE, intermediary.pixels );
  31.  
  32.  
  33.  
  34.  SDL_FreeSurface(initial);
  35.  SDL_FreeSurface(intermediary);
  36.  
  37.  
  38. end;
  39.  


Mein Problem ist: Ich kann die Texture nicht löschen.. Ich weiß nicht warum. Das Problem hierbei ist, dass alles wunderbar initialisiert wird, d.h. an der Stelle wo die Texture noch nicht exisitiert und ich dann die setCaption aufrufe klappt alles wunderbar. schon beim zweiten mal ändert sich nicht.

Ich habe mal beim zweiten Aufruf einen Breakpoint gesetzt und das mal beobachtet: glDeleteTExtures wird korrekt aufgerufen - nur ändert sich nichts am Wert von CaptionPic. Ich dachte die Texture-ID wird beim löschen auf den Wert 0 gesetzt und glGenTexture sollte ihr einen neuen Wert zuweisen. Ich weiß - Ist nicht optimal die Teture freizugeben nur um sie eine Zeile später wieder neu zu erzeugen, aber meine Versuche die Texure zu überschreiben sind auch gescheitert. Am selben Problem: Die Texture verändert sich einfach nicht.

Was aber ist am obrigen Code falsch? Meiner Meinung nach müsste er laufen?

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Sep 20, 2011 19:53 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Wieso sollte der Wert geändert werden?
Und wieso sollte es ein neuer Wert werden wenn der alte gelöscht wurde?

Überprüfst du glError?

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 21, 2011 12:05 
Offline
DGL Member

Registriert: Mo Dez 26, 2005 22:27
Beiträge: 117
Programmiersprache: Pascal, C++
Hi,
ich habe den Fehler gefunden: Beim erstem Aufruf läuft alles super und glError sagt glNoError. Beim zweiten Aufruf sagt er allerdings GL_INVALID_OPERATION. Ich weiß nicht genau warum, aber der zweite (und alle weiteren Aufrufe) erfolgen aus einem SDL Timer. Sobald ich den aufruf ins Main-Loop packe läuft alles super.
Was der SDL Timer eigentlich mit meinem OpenGL zu tun hat weiß ich nicht, bzw was da schiefläuft, aber ich habe auch andere Probleme mit dem Timer was zu unerwüschten Abstürzen des Programms führt - Ich werde einfach keine Aufrufe aus einem Timer in meine Klassen machen.

lg

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 21, 2011 12:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Anscheinend laufen die Timer in einem separaten Thread. Man kann OpenGL aber nur aus dem Thread heraus benutzen, zu dem der Kontext gehört.

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  
BeitragVerfasst: Mi Sep 21, 2011 12:18 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Ein Timer hat keine Ahnung was sonst läuft während der Code ausgeführt wird. Somit kann er es z.B. innerhalb eines glBegin-Blocks machen, was er aber nicht sollte.

_________________
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  [ 14 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.015s | 18 Queries | GZIP : On ]