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

Aktuelle Zeit: Sa Jul 19, 2025 21:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Mo Jan 11, 2010 19:09 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ok dann werd ich mal versuchen zu erklären wie ich das ganze gemacht habe

also initialisiert hab ich das ganze auf diese art und weise -> http://wiki.delphigl.com/index.php/Tutorial_Quickstart

ich render in einer eigenen procedure die im onilde event untergebracht ist

Code:
  1. procedure TForm1.Draw;
  2. begin
  3.   glTranslatef(0, 0, -10);
  4.  
  5.   tsTextColor3f(1, 0, 0);
  6.  
  7.   tsFontBind(fLargeFontID);
  8.  
  9.   tsSetParameteri(TS_ALIGN, TS_ALIGN_CENTER);
  10.  
  11.   glPushMatrix;
  12.     glTranslatef(ClientWidth div 2, 0, 0);
  13.     tsTextOutA('Testzeile! Hier steht ein Testtext');
  14.   glPopMatrix;
  15. end;


ich initialisiere textsuite genau s wie in den sample files aber ich hab nur einen schwarzen bildschirm

ich bekomme keine Hints keine Warnings und keine Errors beim compilieren

mfg

das ziel ganz am ende ist es den text über eine 3D-Szene zu legen


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 11, 2010 19:47 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Und wo erzeugst du den Font? Schließlich verwendest du ja eine ID (fLargeFontID)

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 11, 2010 19:59 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
wenn ich den code richtig verstehe passiert das genau in dieser zeile

Code:
  1.  
  2. procedure TFORM1.Init_TextSuite;
  3. begin
  4. [..]
  5. tsFontCreateCreatorA(pAnsiChar(GetFontFileName), 35, TS_STYLE_NORMAL, TS_DEFAULT, TS_DEFAULT, @fLargeFontID);
  6. [..]


diese wird auch aufgerufen unzwar direkt in der Form1.FormCreate

Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3. DC:=GetDC(Handle);
  4. [..]
  5.   Init_TextSuite;
  6.   Application.OnIdle := IdleHandler;
  7. end;


mfg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 12, 2010 09:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dropye hat geschrieben:
ich bekomme keine Hints keine Warnings und keine Errors beim compilieren

Das sollte auch immer so seit. Ansonsten wäre irgendwas ganz andere fehlerhaft. Bei der TextSuite ist es so, dass du einige Parameter setzen oder Dinge initialisieren musst. Sind diese nicht gesetzt, dann setzt die TextSuite intern einen Fehlercode. Dieser Fehlercode wird natürlich nur zur Laufzeit gesetzt und kann auch nur erfragt werden. Sprich du musst selbst ein Stück Code schreiben was in regelmäßigen Abständen diesen Fehlercode abfragt und im Falle eines Fehlers dann eine Meldung / Exception auslöst. Wenn du die Beispiele hast, dann schau sie dir mal an. Dort gibt es eine Methode CheckError. In dieser Methode erfrage ich mit tsGetError den Fehlercode bzw mit tsGetErrorStringA den passenden Text dazu und mit tsGetErrorFunction die Funktionsgruppe die diesen Fehler erzeugt hat.

Ich muss allerdings gestehen, dass du von deinem Code eher nur den eher unwichtigen Part gepostet hast. Ich hätte so den ganze Code erwartet. Aber okay. Das hatte ich nicht gesagt sondern nur gemeint. ;)
Überprüfe bitte folgendes.
- tsInit muss aufgerufen. Mit den Parametern TS_INIT_TEXTSUITE, TS_INIT_OPENGL und deiner bevorzugten Fontengine. Dürfte vermutlich TS_INIT_GDI sein.
- Du musst mit tsContextCreate einen TextSuite Context erstellt haben.
- Anschließend musst du die Parameter TS_RENDERER und TS_CREATOR setzen.
- Dann können die Fonts erzeugt werden. Das sieht eigentlich okay aus. Sofern natürlich die FontDatei vorhanden ist. Das zeichnen sieht eigentlich auch ganz okay aus.
- Was eventuell noch ein Problem sein könnte. Du setzte keine Y Position. Nur die X Position. "glTranslatef(ClientWidth div 2, 0, 0);" Damit wäre Y noch 0. Die Grundlinien des Textes ist standard immer dort wo sich der Koordinatenursprung befindet. Was im OrthoModus (ursprung oben links) dazu führt, dass die Unterkante der meisten Buchstaben genau oberhalb deines OpenGL Kontextes anfangen würden. Wenn du ein g im Text hättest solltest du zu mindest den kleinen Bogen sehen der nach unten geht.

Wenn du das alles gemacht hast, dann muss dein OpenGL auch dazu passen. Folgende Möglichkeiten die passieren können.
- Wenn du dich im Orthomodus befindest, dann muss dessen Ursprung oben links sein. Sollte der unten links sein und du Backfaceculling aktiviert haben, dann siehst du nur die Rückseite des Textes. Der Text wird aus der Bibliothek auch nur als texturierte Quads erzeugt. Dank Backfaceculling dürfte der dann komplett wegoptimiert werden. Da solltest du den Orthomodus so setzen wie in den Beispielen.
- Wenn du dich im Perspektivmodus befindest, dann kommt es darauf an. Der Text verhält sich dort wie ein ganz normales objekt. Aber mit 1 Pixel der Textur = 1 OpenGL Einheit. Bei Schriftgrößen von 32 ist das ziemlich groß. Ich würde grundsätzlich immer sagen die Schrift sollte in 2D gemacht werden, da das einfach schöner aussieht. Schrift im 3D Modus nur wenn es wirklich sein muss. Wenn du 3D haben willst würde ich trotzdem vorschlagen erst mal 2D zu versuchen bis es klappt.
- Alphatest darf nicht zu extrem eingestellt sein. Alphablending muss auch passen.

Spontan fällt mir gerade nichts mehr ein was es sonst noch sein könnte.

PS: Jetzt habe ich es doch gemacht und alle möglichen Fallstricke aufgeführt...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 12, 2010 10:36 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Kannst du quasi direkt in deiner Doku einbauen unter "Ich sehe keinen Text. Was mache ich falsch?" ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 12, 2010 12:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
http://textsuite.opengl24.de/help/faq_to_print_some_text.html
http://textsuite.opengl24.de/help/faq_its_dosnt_work.html
;)

Man kann da unmöglich alles mit erledigen. In erster Linie soll die Dokumentation als eine Art Referenz mit Hintergrundwissen dienen. Wenn ich da zu viel solcher Texte reinschreiben würde hätte das auch den Nachteil, dass viele wohl bereits vor dem Lesen aussteigen würden. Oder die Hauptaspekte nicht mehr wahrnehmen würden.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 12, 2010 18:26 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
phuu^^

dafür das es die einfachste lösung sein soll isses schon ganz schön viel worauf man da achten muss, aber danke für deine antwort
ich werde es bei gelegenheit durcharbeiten und dann bescheid sagen ob ich text habe der noch nicht, wenn nicht bekommt ihr gleich den ganzen text.

mfg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 13, 2010 09:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Dropye hat geschrieben:
dafür das es die einfachste lösung sein soll isses schon ganz schön viel worauf man da achten muss

Also in der Regel behaupte ich das nicht. ;) Es geht immer einfacher. Ist nur die Frage was man dann noch für Möglichkeiten hat. Ich behaupte normal nur, dass sie dazu da ist um relativ einfach auch komplexere Anwendungsfälle damit abdecken zu können.

Aber hier noch was zum Verständniss. Die Bibliothek ist so konzipiert, dass sie in ein und der selben Abnwendung aus verschiedenen Threads gleichzeitig benutzt werden kann. Da sie oben drein auch noch als DLL vorliegt muss man zu erst die Bibliothek initialisieren. Anschließend muss man ihr sagen mit welchen Systembibliotheken sie zusammen arbeiten soll. OpenGL, GDI, SDL_ttf. Dann muss man einen definierten Arbeitsbereich erstellen. Das ist der tsContext. In diesem Arbeitsbereich kannst du dann Fonts erstellen und mit ihnen Texte zusammenbasteln. Das Initialisieren ist in der Tat nicht so einfach zu verstehen aber muss ja auch nur ein einziges mal gemacht werden und dann ist das Prinzip immer wieder das Gleiche. Der Aufbau der Bibliothek ist so gewählt, dass du als Entwickler gar nicht mehr wissen musst wie die unterschiedlichen Bibliotheken arbeiten oder das du dich mit dem Aufbau der Schrift rumplagen musst. Das wird alles von der Bibliothek vorgenommen und in einer API zur Verfügung gestellt, deren primäre Ausrichtung nur noch die Ausgabe ist.

Den Aufbau der Bibliothek gibt es in der Dokumentation auch als Grafik.
Bild

Vielleicht hilft es ja und trägt zum Verständniss bei.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 13, 2010 11:45 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Gabs irgendwo ein ein (minimales) Beispielprojekt? Vielleicht hilft das beim Verständniss.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jan 13, 2010 13:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Flash hat geschrieben:
Gabs irgendwo ein ein (minimales) Beispielprojekt? Vielleicht hilft das beim Verständniss.

Bei den Downloads gibt es ein komplettes Paket mit einigen Beispielen. Die sind alle nur auf das Nötigste reduziert. Wenn man die dabei liegende übersetzte Anwendung startet, dann sieht man ob das komplex sein könnte oder nicht.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 14, 2010 15:53 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ok ich hab mir jetzt jeden schritt mal angesehen, hab andere beispiele betrachtet und alles nochmal durchgelesen um eventuell doch noch auf irgend einen dummen fehler zu stoßen aber es ist alles genau wie in deinen beispielen (bis auf die initialisierung)

hier mal der ganze code mit dem ich das jetzt immer versucht habe

http://paste2.org/p/610416


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 14, 2010 16:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
In deinem Quellcode fehlt eigentlich der wichtigste Teil, dass Umschalten in den Orhtomodus, also die 2D-Projektion. Nur dort kann man auch 2D-Text "Pixelgenau" (eher Texelgenau) darstellen und ausrichten. Das ist eine der OpenGL-Grundlagen, und evtl. solltest du dich erstmal in die einlesen. Also zuerst in der Projektionsmatrix in den Orthomodus wechseln, dann in die Modelansichtsmatrix, und dort dann deinen Text rendern.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 14, 2010 16:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Erst mal eines vorweg. Was genau willst du mit dem Text anstellen? Willst du eine Art HUD bauen und den Text ganz normal für irgendwelche Beschriftungen verwenden? Oder willst du den Text als 3D Objekt im Raum schweben habe? Oder was willst du damit erreichen? Das wir wissen was du damit vor hast ist wichtig, da wir sonst nicht richtig einschätzen können was du vor hast. Eventuell geben wir dir zu viele Tipps oder sogar die Falschen.

Ich denke mal, dass CheckError keinen Fehler wirft? Text siehst du aber auch nicht. Das Gute. Dein Code sieht soweit okay aus. Das du keinen Text siehst liegt wohl an einer falschen größe/position des Textes etc.

In deinem Code ist das Problem, dass du dich wärend dem Zeichnen in der Perspektiv befindest. Dein Text würde so also ein 3D Objekt darstellen. Wenn das nicht gewünscht ist, dann musst du vorher mit glOrtho den 2D Modus aktivieren. Deswegen bitte den ersten Absatz beantworten.

Wenn du den 3D Modus haben willst, dann solltest du dir mal 3D_VCL Beispiel anschauen. Der Text ist in 3D gigantisch. Deswegen habe ich den in dem Beispiel bei einer Tiefe von 100 gezeichnet. Oben drauf kommt eine Skalierung von 0.1 (10% Größe).
Und zu guter Letzt stelle ich den Text mit "glScalef(1, -1, 1)" auf den Kopf. Der Text hat als Ursprung ObenLinks. Im 3D Modus ist der Ursprung UntenLinks. Deswegen die Skalierung von -1. Dadurch würde das umgedreht werden.

In dem Fall könnte sogar sein, dass CullFace dir den Text auch wegschmeißt, da man nur die Rückseite sehen würde. Da würde ich aktuell erst mal CullFace deaktivieren.

[edit] Ah. Zu langsam. Und Sascha hat mit weniger Worten prinzipiel das Gleiche gesagt. ;)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 14, 2010 16:42 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ok also ich will den Text einfach genau wie du schon gesagt hast wie ein HUD verwenden er soll sich immer im 2D Modus über der 3D szene befinden

Ich habe jetzt auch mal mir das mir dem glortho angeguggt und herausgefunden das wenn ich erst gluPerspective und dann glortho setzte dies nicht geht also hab ich gluPerspective rausgenommen und Tadaaa^^

hab also um es mal zu zeigen nur die markierte zeile geändert
Code:
  1. procedure Tform1.Render;
  2. begin
  3.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.  
  5.   glMatrixMode(GL_PROJECTION);
  6.   glLoadIdentity;
  7. ------------------
  8.   glOrtho(0, ClientWidth, ClientHeight, 0, 5, 20);  <<--- von gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);  
  9. ------------------ 
  10.   glMatrixMode(GL_MODELVIEW);
  11.   glLoadIdentity;
  12.  
  13.   draw;
  14.  
  15.   SwapBuffers(DC);
  16. end;


ich hab zwar bisher nur schwarze kästchen aber er macht erstmal was er zeichnet die buchstaben, aber noch nicht ganz so das man es auch lesen kann

das dürfte wohl mit der schriftartdatei zusammenhängen oder?

mfg

[edit] nein die datei scheint zu gehen er giebt mir eine fehlermeldung sobald was nicht geht und wenn ich als schriftart Arial angebe kommen genau die selben komischen kästchen raus


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jan 14, 2010 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das du nur schwarze Kästchen siehst liegt daran, dass du noch das Blending aktivieren musst. Die TextSuite erstellt nur Texturierte Quads. Und die Information ob ein Pixel sichtbar ist oder nicht liegt im AlphaKanal der Textur. Du musst OpenGL auch noch sagen was er damit anstellen soll.

Folgendes nachdem OpenGL Initialisiert wurde sollte reichen.
Code:
  1.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  2.   glEnable(GL_BLEND);


Zum Thema gluPerspective und glOrtho. Die beiden Befehle multiplizieren sich in die aktuelle Matrix hinein. Da steht aber schon was drin. Entsprechend wurde da Müll zusammengerechnet. Um also wärend der Perspective in den Orthomodus zu wechseln musst du die Matrix aktvieren und mit glLoadIdentity wieder zurücksetzen. Um deine aktuelle Matrix zu sichern kannst du glPushMatrix und glPopMatrix benutzen. Das sichern logischerweise vor dem zurücksetzen und wiederherstellen natürlich erst dann wenn alles im 2D Modus erledigt ist. Ständiges Hin und Herwechseln wärend eines Frames solltest du tunlichst vermeiden.


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


Wer ist online?

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