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

Aktuelle Zeit: Do Jul 17, 2025 20:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Schriften und Systemaussetzer
BeitragVerfasst: Mo Apr 10, 2006 13:05 
Offline
DGL Member

Registriert: Fr Feb 03, 2006 17:03
Beiträge: 28
Hallo mal wieder!

Ich hab mich mal ein bisschen mit Schriften beschäftigt und hab das auch prinzipiell ganz gut hingekriegt (persönliches Empfinden - sehr trügerisch ;)). Das ganze basiert auf der wglUseFontBitmaps und ist wie im Wiki beschrieben umgesetzt.

Mein Problem ist jetzt, dass die GL offenbar der Auffassung ist, dass Texte, die im Nirvana anfangen, auch im Nirvana enden. Genau gesagt, will ich eine Aufschrift so auf ein Panel bringen, dass ein Teil schon unterhalb der unteren Panelgrenze liegt und somit nicht mehr sichtbar ist. Sobald ich aber glRasterPos3f(0, -1, -1) aufrufe oder vorher versuche, mit glTranslate(0, -1, 0) den Bildausschnitt nach unten zu schieben, schreibt er gar nichts mehr. Am oberen Panelrand klappt das übrigens hervorragend, da wird dann halt nur noch der "halbe" Text angezeigt.


Eine zweites, (für mich) äußerst merkwürdiges Symptom hab ich in nem anderen Zusammenhang erlebt. In diesem Projekt hab ich insgesamt vier Renderkontexte (drei auf Panels und einer innerhalb eines Frames), die verwaltet werden. Die drei auf den Panels werden synchron durch ein Timer-Ereignis gezeichnet, das Frame zeichnet sich selbst unabhängig von den andern, wenn es nötig ist (also z.B. bei Paint-Ereignissen). Die Kontexte greifen jedoch auf die selben Texturen zurück und sind daher über wglShareLists aneinander gebunden.

Jetzt ist es mir schon ein paar mal passiert (genauer Auslöser unbekannt, es wurde jedoch immer verhältnismäßig oft auf den Frame-Kontext gezeichnet), dass das Frame-Panel plötzlich für kurze Zeit (vielleicht 5s) weiß wurde. In dieser Zeit hat sogar Winamp aufgehört zu spielen (sehr bedauerlich), die Standart-Windows-Funktionen (Startleiste & Co) liefen aber noch. Ich hab während dieser Zeit (bei jedem Render-Vorgang) auch mal die GL-Fehler abfangen lassen, waren aber keine da (Programmfehler auch nicht).

Zweimal ist es sogar schon vorgekommen, dass sich während diesen fünf Sekunden die drei anderen Kontexte abgeschaltet haben. Sie haben dann nur noch schwarz (Hintergrundfarbe) angezeigt, auch als der Frame schon wieder aktiv war und ganz normal weitergearbeitet hat.

Ich hab zwischenzeitlich auch schonmal den Rechner neu gestartet, es kommt aber leider immer mal wieder vor :( .

Hat vielleicht jemand von euch ne Idee, wo ich da anfangen könnte, zu suchen?

Ogridi

// Edit: Mir ist grade aufgefallen, dass bei dieser "Alles-Wird-Schwarz"-Effekt unabhängig von dem anderen auftreten kann und dass dann in allen Kontexten nichts mehr angezeigt wird außer Text, also keine Quads und keine LineLoops.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 10, 2006 14:35 
Offline
DGL Member
Benutzeravatar

Registriert: So Okt 26, 2003 20:07
Beiträge: 249
Also ganz ohne Code isses natürlich schwer.
Weil du bei translate sowas wie -1 einsetzt, geh ich mal davon aus, das du nicht im orthagonalmodus bist. vielleicht hilft dir das bei dem ersten Problem
weiter, weil du dann Angaben in Pixel machen kannst/musst.

Zum 2. kann ich dir leider nichts sagen.

gruß

_________________
I'm not the signature, I'm just cleaning the floor...

Derzeitiges Projekt:
FireBlade Particle Engine (Release R2 2009.06.29)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 10, 2006 15:01 
Offline
DGL Member

Registriert: Fr Feb 03, 2006 17:03
Beiträge: 28
Naja, bin (leider) schon im Ortho-Modus. Benutzt man dann kein Translate?

Was den Code anbetrifft:

Code:
  1. var
  2.   FontLists : Cardinal;
  3.  
  4. // wird am Anfang nach erstellen des Renderkontexts aufgerufen
  5. procedure TfraTgaList.CreateFontLists();
  6. var
  7.   Font : TFont;
  8. begin
  9.  
  10.   FontLists := glGenLists(256);
  11.  
  12.   Font := TFont.Create;
  13.  
  14.   try  
  15.     Font.Name := 'MS Sans Serif';
  16.     Font.Size := 8;
  17.     Font.Style := [];
  18.  
  19.     SelectObject(DC, Font.Handle);
  20.     wglUseFontBitmaps (DC, 0, 255, FontLists);
  21.    
  22.   finally
  23.     FreeAndNil(Font);
  24.    
  25.   end;      
  26.  
  27. end;
  28.  
  29. procedure TfraTgaList.ShowText(pText : String);
  30. begin
  31.  
  32.    glListBase(FontLists);
  33.    glCallLists(Length(pText), GL_UNSIGNED_BYTE,  Pointer(pText));
  34.    
  35. end;
  36.  
  37. [....]
  38.  
  39. procedure TfraTgaList.Render();
  40. begin
  41.  
  42.   ActivateRenderingContext(DC, RC, false);
  43.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  44.  
  45.   glMatrixMode(GL_PROJECTION);
  46.   glLoadIdentity;
  47.   glViewport(0, 0, DrawWidth, DrawHeight);   // DrawWidth / -Height = Zeichenfläche
  48.   glOrtho(0, DrawWidth, 0, DrawHeight, NEAR_CLIPPING, FAR_CLIPPING);
  49.   glTranslatef(0, 0, -5);
  50.  
  51.   glMatrixMode(GL_MODELVIEW);
  52.   glLoadIdentity;
  53.  
  54.   glDisable(GL_TEXTURE_2D);
  55.   glColor3f(0,0,0);
  56.  
  57.   glRasterPos3f(0, 0, -1);  // funktioniert
  58.   glRasterPos3f(0, -1, -1);  // funktioniert nicht
  59.  
  60.   ShowText('Text');  
  61.  
  62.   glColor3f(1,1,1);
  63.  
  64.   SwapBuffers(DC);
  65.  
  66. end;



Und zu der anderen Sache bring ich auch gern noch Codeauszüge, aber ich hab im Moment wie gesagt keinen Plan, wo ich da anfangen soll.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 10, 2006 15:25 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Doch man benutzt glTranslate durchaus im Orthomodus. Nur halt nicht zur Positionierung, da kann man auch gleich die Koordinaten angeben. Aber wenn man was dynamisch verschieben will dann schon.

Das mit dem kurzzeitigen ausfall find ich schon recht seltsam. Kanns mir aber auch nicht erklären.

Zu den BitmapFonts: Diese Methode sieht recht ansprechend aus und ist auch verhältnismäßig leicht zu implementieren. Allerdings wirst du feststellen, dass bei längeren Texten deine Framerate brachial zu boden geht. Deshalb solltest du dich schon mal seelisch und moralisch auf texture-Fonts einstellen. Is dann zwar nicht mehr ganz so simple aber trotzdem wohl die bessere Alternative.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 10, 2006 15:54 
Offline
DGL Member

Registriert: Fr Feb 03, 2006 17:03
Beiträge: 28
Zitat:
Allerdings wirst du feststellen, dass bei längeren Texten deine Framerate brachial zu boden geht. Deshalb solltest du dich schon mal seelisch und moralisch auf texture-Fonts einstellen. Is dann zwar nicht mehr ganz so simple aber trotzdem wohl die bessere Alternative.


Für dieses Projekt reichen die Bitmap-Schriften (hoffentlich ;)) leistungstechnisch aus. Die Render-Prozedur wird nur bei OnPaint und ein paar ähnlichen Ereignissen aufgerufen und der Text besteht nur aus wenigen Worten. Es wäre aber vielleicht eine Alternative, was dieses Rand-Problem anbetrifft. Man müsste doch auch aus dieser "Liste" Texturen extrahieren können, die man dann bei Programmstart irgendwo speichert!? Weil das wäre mir irgendwie lieber, als eine eigene Schriftart-Grafik herzuzaubern (*schlechter-Grafiker-ist*).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 10, 2006 16:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das mit dem RasterPos bei negativen Werten ist bekannt und anscheinend auch durchaus so gewollt. Da wird dann kurzerhand das Zeichnen des Textes deaktiviert. Dem kannst du mit dem Befehl glBitmap aber abhelfen. Du musst in diesem Falle nur ein nil für den letzten Parameter übergeben. Die ersten 4 sollten dann auch 0 sein. Für dich also nur die x(y)move interessant. Positioniert auf 0, 0 kannst du damit den Punkt bequem überallhin verschieben. Diese Positionierung ist Relativ.

Das was wglUseFontBitmaps macht sind im wahrsten Sinne des Wortes bitmaps. Also die haben nur 0 und 1 für jedes Pixel gespeichert. Und dann 8 Stück in einem Byte. Extrahieren ist schlecht und selber machen ... ich weiß nicht ob das den Aufwand Wert wäre.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 10, 2006 16:50 
Offline
DGL Member

Registriert: Fr Feb 03, 2006 17:03
Beiträge: 28
Danke für den Tip! :D

Zu den Ausfällen fällt dir auch nichts ein?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 10, 2006 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Nö. Spontan nicht. Du könntest aber mal schauen was deine CPU Leistung macht. Evtl kann es auch sein, dass der VCL Thread evtl blockiert wird. Durch was auch immer. Momentan kannst du nur versuchen das Phänomen einzudemmen und zu schauen wann und wie es auftritt. Wenn du die Möglichkeit hast, dann versuch mal das Programm auf einem anderen Rechner zu starten. Evtl ist es nur etwas in deinem System. Was die Sache zwar nur geringfügig besser macht. Aber dann kannste es schon mal weitergeben ohne, dass du dir sorgen machen musst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 10, 2006 17:59 
Offline
DGL Member

Registriert: Fr Feb 03, 2006 17:03
Beiträge: 28
Na, dann werd ich das mal machen. Danke jedenfalls für den Hinweis auf glBitmap!


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


Wer ist online?

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