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

Aktuelle Zeit: Sa Jul 12, 2025 15:22

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Aug 30, 2007 10:11 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Hi!
Ich versuche jetzt die Beispiele von Lossy so zu ändern, dass ich den generierten Text auch auf einem eigenen Objekt darstellen kann (z.B. Farbverlauf in alle Ecken des Fensters).

Ich habe einen blauen Hintergrund und in der Mitte ein Quadrat mit Farbverlauf. Sobald ich nun die Zeilen zum Rendern des Textes nicht mehr auskommentiere wird das Quadrat schwarz, bzw. mit Alphablending ein bisschen dunkler als der Hintergrund, der Text ist aber nicht zu sehen. Siehe Zeile mit "// << hier"

(Bei TextBeginBlock habe ich auch schon verschiedene Werte für Left, Top usw ausprobiert.)

Kann jemand sagen, warum?

Code:
  1.  
  2. procedure TMainForm.render;
  3. var
  4.   Temp: Integer;
  5. begin
  6.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.  
  8.   glMatrixMode(GL_PROJECTION);
  9.   glLoadIdentity;
  10.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  11.  
  12.   glMatrixMode(GL_MODELVIEW);
  13.   glLoadIdentity;
  14.  
  15.   glTranslatef(0, 0, -30);
  16.  
  17.   glBegin(GL_QUADS);
  18.     glColor3f(1, 0, 0); glVertex3f(-10, -10, 0);
  19.     glColor3f(1, 1, 0); glVertex3f(11, -10, 0);
  20.     glColor3f(0, 0, 1); glVertex3f(11, 10, 0);
  21.     glColor3f(0, 1, 0); glVertex3f(-10, 10, 0);
  22.   glEnd;
  23.  
  24.  
  25.   Temp := (ClientHeight - 10) div 3;
  26.  
  27.   // set align to center
  28.   tsSetParameteri(TS_ALIGN, TS_ALIGN_CENTER);
  29.   tsSetParameteri(TS_VALIGN, TS_VALIGN_CENTER);
  30.   CheckError;
  31.  
  32.   glPushMatrix;
  33.       tsTextBeginBlock(20, 0, ClientWidth -40, Temp, TS_BLOCKFLAG_WORD_WRAP or TS_BLOCKFLAG_NO_CLIP);
  34.       tsFontBind(fCowFontID);
  35. //      tsTextOutA(tsGetString(TS_FONT_FACE_NAME)); // << hier
  36. //      tsTextOutW(#32'(');
  37. //      tsTextOutA(tsGetString(TS_FONT_STYLE_NAME));
  38. //      tsTextOutW(')'#13#10);
  39.  
  40.     tsTextEndBlock;
  41.   glPopMatrix;
  42.   CheckError;
  43.  
  44.   // EDIT: Die Lösung
  45.   glDisable(GL_TEXTURE_2D);
  46.  
  47.   glFlush;
  48.  
  49.   SwapBuffers(FDC);
  50. end;


Zuletzt geändert von berens am Do Aug 30, 2007 12:55, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 30, 2007 11:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das Problem ist viel subtiler. Die Fonts basieren auf Texturen. Und ich denke die sind in der einen Ecke schwarz. Die Texturen deaktiviere ich nicht explizit. Mach also vor deinem Quad oder hinter tsTextEndBlock ein glDisable(GL_TEXTURE_2D) und dann sollte es nicht mehr schwarz sein.

PS: Solche großen Codestücke bitte lieber als Dateianhang posten. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 30, 2007 13:02 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Edit von oben: Code verkleinert *schäm*

Ok, das hat geklappt, Rechteck ist nun sichtbar.

Leider die Schrift noch nicht.

Macht
Code:
  1.  
  2.   NearClipping = 1;
  3.   FarClipping  = 1000;
  4.   gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  5.  


eventuell die Probleme?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 30, 2007 13:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bei der Schrift solltest du dir eines bewusst vor Augen halten. Die Schrift ist in erster Linie für 2D Ausgaben konzipiert. Entsprechend ist die Größe einer OpenGL Einheit normalerweise auch 1 Pixel. In 3D ist die Einheitsgröße aber nicht 1 Pixel groß. Sondern wie bei deinem Quad erstrecken sich der Wertebereich von -10 bis 10. Und bei tsTextBeginBlock übergibst du für Links bereits eine 20. Entsprechend ist der Text schon viel zu weit rechts. Bzw benutzt du für VAlign auch Center was dafür sorgt, dass dein Text sonst wie weit nach unten zentriert wird.

Du darfst jetzt aber bei tsTextBeginBlock auf keinen Fall -10 bis 10 angeben. Das würde evtl zwar funktionieren aber dann wären deine Buchstaben gigantisch zu groß und würden nach 20 "Pixeln" umgebrochen werden. Die Buchstaben sind in jedem Fall immer Pixelorientiert! Also musst du vor dem Zeichnen die Textausgabe etwas runterskalieren und die Angaben bei tsTextBeginBlock so anpassen wie du es gerne hättest. Aber immer unter Berücksichtigung der von dir gewählten Schriftgröße. Je nachdem wie groß die Schrift zu sehen sein soll solltest du auch die Schriftgröße etwas erhöhen. In etwa so wie es auch in 2D der Fall wäre. Weil die Textur sonst bescheiden aussieht. Und dazu passend natürlich dann die Breite setzen und runterskalieren.

Um zu sehen wie es in 3D gemacht wird habe ich aber auch ein spezielles 3D Beispiel mit zu den Beispielen gepackt. Evtl solltest du da auch mal einen Blick hinein werfen.

Aber bedenke, dass es in erster Linie für 2D gemacht wurde. Bei dem 3D Beispiel trickse ich etwas (deaktivierter Tiefentest), da die Buchstaben irgendwie mit der Hintergrundfläche ein doch extremes Z-Fighting veranstalten. Und das würde so nicht mehr überall bedenkenlos funktionieren. Ich bin da aber bisher noch nicht großartig weiter darauf eingegangen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 30, 2007 14:38 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Ansich will ich auch nur 2D machen :cry:

Da ich ja leider immernoch nicht komplett bei OpenGL durchgestiegen bin, kann es nun sein, dass ich da mehrere Techniken durcheinander werfe.

Ich habe jetzt meinen Code soweit korrigiert, dass der Viewport korrekt ist und an die Bildschirmbreite und Höhe angepasst ist.

Was kann nun noch sein, dass der Text nicht dargestellt wird?

Code:
  1. procedure TMainForm.render;
  2. var
  3.   Temp: Integer;
  4. begin
  5.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  6.  
  7.   glMatrixMode(GL_PROJECTION);
  8.   glLoadIdentity;
  9.   glViewport(0,0,ClientWidth,ClientHeight);
  10.   glOrtho(0,ClientWidth,0,ClientHeight,0,128);
  11.  
  12.   glMatrixMode(GL_MODELVIEW);
  13.   glLoadIdentity;
  14. //
  15. //  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  16. //
  17. //  glMatrixMode(GL_MODELVIEW);
  18. //  glLoadIdentity;
  19.  
  20.   glTranslatef(0, 0, -50);
  21.  
  22.   glBegin(GL_QUADS);
  23.     glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
  24.     glColor3f(1, 1, 0); glVertex3f(ClientWidth, 0, 0);
  25.     glColor3f(0, 0, 1); glVertex3f(ClientWidth, ClientHeight, 0);
  26.     glColor3f(0, 1, 0); glVertex3f(0, ClientHeight, 0);
  27.   glEnd;
  28.  
  29.  
  30.   Temp := (ClientHeight - 10) div 3;
  31.  
  32.   // set align to center
  33.   tsSetParameteri(TS_ALIGN, TS_ALIGN_CENTER);
  34.   tsSetParameteri(TS_VALIGN, TS_VALIGN_CENTER);
  35.   CheckError;
  36.  
  37.   glPushMatrix;
  38.     tsTextBeginBlock(0, 0, ClientWidth -40, Temp, TS_BLOCKFLAG_WORD_WRAP or TS_BLOCKFLAG_NO_CLIP);
  39.     tsFontBind(fCowFontID);
  40.     tsTextOutA('TEST 01234567890');
  41.     tsTextOutW(#32'(');
  42.     tsTextOutA(tsGetString(TS_FONT_STYLE_NAME));
  43.     tsTextOutW(')'#13#10);
  44.     tsTextEndBlock;
  45.   glPopMatrix;
  46.   CheckError;
  47.   glDisable(GL_TEXTURE_2D);
  48.  
  49.  
  50.   glFlush;
  51.  
  52.   SwapBuffers(FDC);
  53. end;
[/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 30, 2007 15:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Keine Ahnung was du sonst noch so verändert hast. Aber dein Code anstelle von Form.OnPaint, in dem originalen Beispiel, funktioniert.

Bis darauf, dass der Text grün ist und auf dem Kopf steht. Grün ist weil die letzte gesetzte Farbe grün ist und auf dem Kopf steht er weil du für glOrtho bei Bottom eine 0 und für Top die ClientHeight angegeben hast. Was ja nicht falsch ist und auch ganz gerne von einigen gemacht wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 30, 2007 15:43 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Jetzt wo du es sagst...

Ich weiss es auch nicht. Ich hab die Original-Vorlage genommen, meinen Quad-Code rein und glDisable(GL_TEXTURE_2D); am Schluss.

Jetzt noch glColor3f(1, 1, 1); vor
// draw cow Text
damit der Text wieder weiß wird, und es funzt.

Dann wollen wir doch mal schauen, was man damit alles anstellen kann!

Vielen Dank Lossy für super Komponente und die Hilfe!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 30, 2007 16:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ja. Ich beschränke mich in den Beispielen auf das Nötigste. Um nicht zu sehr zu verwirren.

Und falls du die Textfarbe innerhalb eines Blockes ändern möchtest musst du tsTextColor* benutzen, da der Text nicht sofort gerendert wird und die Farbsetzung dann natürlich auch erst später statt finden darf.

PS: Bitte Bitte :) Und falls Fragen sind immer raus damit.


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


Wer ist online?

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