Einzelnen Beitrag anzeigen

Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#8

AW: OpenGL - Text ausgeben mit TextSuite klappt nicht

  Alt 7. Sep 2010, 15:28
Bevor ich zu deinem Problem komme. Eigentlich alle OpenGL States kannst du auch temporär aktivieren. Also zum Beispiel kannst du Licht für einige Objekte aktivieren sonst aber komplett deaktiviert lassen. Genau so auch das Backface culling. Das kannst du explizit für 2-3 Objekte deaktivieren und sonst komplett aktiv lassen.

Mir persönlich ist es wichtig, dass man versteht warum etwas ist wie es ist. Dass der Text auf dem Kopf steht hat durchaus einen (hoffentlich) plausiblen Grund. Und zwar liegt das daran wie der Orthomodus aktiviert wurde. In OpenGL ist keineswegs vorgeschrieben mit welchen Werten glOrtho aufgerufen werden sollte. Der Schreiber des von dir verlinkten Tutorial arbeitet in 2D lieber mit dem Ursprung unten links. Ich persönlich empfinde es um ein vielfaches angenehmer mit einem Koordinatenursprung oben links zu arbeiten. Da ich sehr viel 2D arbeite (sowohl Windows als auch OpenGL). Mit einem Ursprung unten links muss man ständig so etwas wie ClientHeight - Position.Y rechnen. Das würde mit einem Ursprung oben links entfallen.

Du hast jetzt 2 mögliche Lösungen.
1) Wenn du den Ursprung oben links haben willst, dann genügt es bei glOrtho den dritten und vierten Parameter zu tauschen. Wenn du schon Dinge in 2D zeichnest musst du bei diesen aber die Y Positionen anpassen.

2) Wenn du den Ursprung unten links haben willst, dann musst du vor dem Zeichnen deines Textes die OpenGL Ansicht "verdrehen". Und zwar müssen wir dafür sorgen, dass die von der TextSuite übergebenen Y Werte negiert betrachtet werden. Dazu genügt es direkt vor dem Zeichnen ein "glScalef(1, -1, 1);" aufzurufen. Damit würden die in der Modelview Matrix gespeicherten Werte (für Y) negiert werden. Und schon sollte der Text auch mit backfaceculling richtig herum zu sehen sein.

Wichtig: Es ist wichtig, dass du das Scale nur direkt vor dem Zeichnen aufrufst. Denn ansonsten würde das Positionieren des Textes bereits negiert werden. Und damit sollte dein Text im nirvana landen. Dann ist der Text wieder verschwunden. Kleines Beispiel.
Delphi-Quellcode:
  glPushMatrix;
// glScalef(1, -1, 1); << Böse
    glTranslatef(ClientWidth div 2, 50, 0);
    glScalef(1, -1, 1); << Gut
    tsTextOutA('TextSuite Sample - Single Line');
  glPopMatrix;
Wenn du ohne Push- und PopMatrix arbeiten möchtest (was durchaus etwas an Leistung bringen dürfte), dann musst du nach der Textausgabe die Y Werte in der Modelview Matrix wiederherstellen. Also noch mal negieren damit sie wieder positiv werden.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat