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

Aktuelle Zeit: Di Jul 08, 2025 00:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SCHRIFT in OPENGL
BeitragVerfasst: Mi Jan 15, 2003 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo NG,

eine Frage:

Ich möchte in meinem Fenster an den Positionen (x,y,z) Schrift ausgeben. Nun habe ich in der API gelesen, dass das so geht:

Code:
  1.  
  2.  
  3.   FDC:=CreateCompatibleDC(0);
  4.  
  5.   Base:=glGenLists(256);
  6.  
  7.   Font:=CreateFont(-12,30,0,0,FW_BOLD,0,0,0,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,ANTIALIASED_QUALITY,FF_DONTCARE or DEFAULT_PITCH,'Comic Sans MS');
  8.  
  9.   SelectObject(FDC,Font);
  10.  
  11.   wglUseFontOutlines(FDC,0,255,Base,0,0.2,WGL_FONT_POLYGONS,nil);
  12.  
  13.  


und dann in der DrawScene:

Code:
  1.  
  2.  
  3.     glColor3f(0.0, 1.0, 0.0);
  4.  
  5.     glCallList(67);
  6.  
  7.  


Das funzt auch recht gut - es wird der rote Buchstabe dargestellt.

Problem nun: das Programm bleibt beim Befehl wglUseFontOutLines(..) für ca. 5s stehen und macht dann normal weiter - aber immer nur einmal bei der Initialisierung der Szene, wo ich die obigen Befehle habe. Hat jemand Abhilfe ?

Zweites Problem: wenn ich den Buchstaben ausgebe, verschiebt sich die ganze Szene um einige Pixel nach rechts (also rechter Bildschirmrand), obwohl meine Szene immer mittig um mein lokales Koord positioniert ist.
Ohne den Buchstabenbefehl stimmt die Position wieder. Gibt es vielleicht eine fertige Proze zum ausgeben von Text an der Pos (x,y,z) mit Ausrichtung nach einer der Achsen ? Wie löse ich das Problem ?

Gruss

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 16:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Problem nun: das Programm bleibt beim Befehl wglUseFontOutLines(..) für ca. 5s stehen und macht dann normal weiter - aber immer nur einmal bei der Initialisierung der Szene, wo ich die obigen Befehle habe. Hat jemand Abhilfe ?  

Da gibts keine Abhilfe, das ist die Zeit die deine Grafikkarte braucht um aus dem Windowsfont die DisplayListen zu erstellen.Moderne Grafikkarten tun das in der Regel schnell, während sich z.B. ne Kyro-Karte dabei relativ viel Zeit lässt.

Zitat:
Zweites Problem: wenn ich den Buchstaben ausgebe, verschiebt sich die ganze Szene um einige Pixel nach rechts (also rechter Bildschirmrand), obwohl meine Szene immer mittig um mein lokales Koord positioniert ist.  
Ohne den Buchstabenbefehl stimmt die Position wieder. Gibt es vielleicht eine fertige Proze zum ausgeben von Text an der Pos (x,y,z) mit Ausrichtung nach einer der Achsen ? Wie löse ich das Problem ?  

Sichere mal bevor du den Text ausgibts alle Attribute mittels glPushAttrib(GL_ALL_ATTRIB_BITS) und hol sie nach dem Zeichnen deines Textes mittels glPopAttrub wieder zurück.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 16:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo SOS,

DANKE.

die Karte ist ne Creative Labs Geforce4 TI4600 .. ich dachte, die wäre schneller. Gibt es eigentlich zum Ausgeben fertige Prozeduren ?

Gruss

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jan 15, 2003 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
die Karte ist ne Creative Labs Geforce4 TI4600 .. ich dachte, die wäre schneller.


Axo...ich seh grade, das du Outlined Fonts (3D-Fonts) benutzt, daher dauert das Erstellen der DisplayListen auch solange.
Im Normalfall reicht aber auch einfacher 2D-Text der mittels wglUseFontBitmaps() erstellt wird, der ist auch weitaus schneller beim Rendern.

Zitat:
Gibt es eigentlich zum Ausgeben fertige Prozeduren ?

Nein, aber ich hab mal vor Kurzem hier ein Demo zum Thema RenderToTexture gepostet, hier der Link : <a href='http://www.delphigl.de/files/rendertotex.zip' target='_blank'>http://www.delphigl.de/files/rendertotex.zip</a>
dort ist ne Unit von mir, die 2D-Text in OpenGL darstellt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 18, 2003 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo SOS,

vielen Dank. Ich habe mit Dein Unit runter geholt und integriert. Nun ein neues Problem:

zur Laufzeit bekomme ich einen Programmabsturz mit der Begründung: zu viele Exceptions. Der Fehler nach einiger Zeit nach dem Aufruf Deiner Prozedur erstellebitmapfonts auf und zwar in der Zeile: glGenLists.

Ich bin so vorgegangen:

zunächst erstelle ich das Fenster, rufe dort die Prozedur erstellebitmapsfonts auf und in der Szene (also in der Schleife zur Erstellung der Szene ) mache ich :

Code:
  1.  
  2.  
  3.  &nbsp; &nbsp;glStartBitmapText(640,480);
  4.  
  5.  &nbsp; &nbsp;glPrintBitmapTextEx(FFONT, 10, 15, 'TEST');
  6.  
  7.  &nbsp; &nbsp;glEndBitmapText;
  8.  
  9.  


Hast Du eine Idee warum das passiert ?


Gruss


Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 18, 2003 15:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

eine kleine Abhilfe gibt es schon... :)

Wenn du deine Schriften erstellst, erstelle sie nicht im Hauptthread, sondern erstelle einen Extra Thread in dem du dann die Schrift Initialisierst... Dann läuft dein Prog normal weiter und die schrift wird trotzdem erstellt.

Nachteil: Solltest du die schrift gleich am anfang des Programmes benutzen, wird sie erst nach kurzer Zeit dargestellt... denn sie brauchen immernoch genausolange zum laden, nur halten sie in der Zeit dein programm nicht an.. :wink:

Au'revoir,
Aya~

PS: Eine weitere möglichkeit wäre wenn du nicht alle buchstaben als DisplayList erstellst, sondern z.B. nur A-Z... das ginge so:
Code:
  1. wglUseFontOutlines(FDC,ASCIINR_VOM_STARTBUCHSTABEN,ASCIINR_VOM_ENDBUCHSTABEN,Base,0,0.2,WGL_FONT_POLYGONS,nil);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 18, 2003 15:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
In der Unit "glfont.pas" habe ich selbst nen DC und nen RC deklariert.Diesen DC braucht man, um den Font zu erstellen.

Ich gehe jetzt mal davon aus, das du dir deinen eigenen DC bzw. RC erstellts und den aus der Font-Unit nicht benutzt.Deshalb wird dein Font auch gar nicht richtig erstellt, und das Programm bringt dir dann beim Zeichnen ne Exception.

Lass also mal deinen DC bzw. RC weg und nimm die aus der Font-Unit!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 19, 2003 11:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo SOS, Hallo AYA,

vielen Dank - die Sache funzt jetzt. Aber: meine Szene wird durch die Schrift verschoben. Normalerweise richte ich Sie mittig um mein lokales Koordsys ein, was auch funzt. Sobald Schrift dazu kommt, wird sie mehr und mehr verschoben. Ich habe den Rat von SOS befolgt und folgendes in der DrawScene gemacht:


Code:
  1.  
  2.  
  3.  &nbsp; &nbsp;wglMakeCurrent(h_DC,h_RC);
  4.  
  5.  &nbsp; &nbsp;glPushAttrib(gl_all_attrib_bits);
  6.  
  7.  &nbsp; &nbsp;glCallList(67);
  8.  
  9.  &nbsp; &nbsp;glCallList(68);
  10.  
  11.  &nbsp; &nbsp;glCallList(69);
  12.  
  13.  &nbsp; &nbsp;glPopAttrib;
  14.  
  15.  


Die Verschiebung erfolgt durch den glCallList Aufruf.

Kann jamand helfen ?


Gruss

Markus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 19, 2003 11:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
Code:
  1.  
  2.  
  3.  &nbsp; &nbsp;wglMakeCurrent(h_DC,h_RC);
  4.  
  5.  &nbsp; &nbsp;glPushAttrib(gl_all_attrib_bits);
  6.  
  7.  &nbsp; &nbsp;glCallList(67);
  8.  
  9.  &nbsp; &nbsp;glCallList(68);
  10.  
  11.  &nbsp; &nbsp;glCallList(69);
  12.  
  13.  &nbsp; &nbsp;glPopAttrib;
  14.  
  15.  


Die Verschiebung erfolgt durch den glCallList Aufruf.


Ändere den Code mal folgendermaßen :
Code:
  1.  
  2.  
  3.  &nbsp; &nbsp;wglMakeCurrent(h_DC,h_RC);
  4.  
  5.  &nbsp; &nbsp;glPushAttrib(gl_all_attrib_bits);
  6.  
  7.  &nbsp; &nbsp; &nbsp;glPushMatrix;
  8.  
  9.  &nbsp; &nbsp; &nbsp; &nbsp;glCallList(67);
  10.  
  11.  &nbsp; &nbsp; &nbsp; &nbsp;glCallList(68);
  12.  
  13.  &nbsp; &nbsp; &nbsp; &nbsp;glCallList(69);
  14.  
  15.  &nbsp; &nbsp; &nbsp;glPopMatrix;
  16.  
  17.  &nbsp; &nbsp;glPopAttrib;
  18.  
  19.  


Mit glPushMatrix legst du die aktuelle Modellansichts-matrix auf den Stack (speicherst also quasi alle Positionsinformationen) und mit glPushMatrix holst du diese Informationen wieder zurück!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 19, 2003 11:52 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 03, 2003 14:15
Beiträge: 36
Hallo SOS,



S U P E R - das wars.

Danke

Gruss

Markus


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


Wer ist online?

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