![]() |
TextSuite will nicht
Kann ich in TextSuite auf die gleiche art und weise wie mit
Delphi-Quellcode:
Text ausgeben ?
glPrintBitmap(10, PlaystateYPos, SongName, 1);
Scheinbar nicht denn es wird nichts gerendert. Habe mir mal das Sample SingleLine angeschaut dieses bassiert aber auf 'glOrtho' Ich verwende aber 'gluPerspective' mit kleinen änderungen wird mir der Text im Sample angezeigt aber auf den Kopf und nicht an der position wie ich sie gerne hätte. Edit; na gut das geht mit glScalef(1, -1, 1) dann stehts nicht auf den Kopf In meinen Code geht gar nichts. :roll: Ich benötige diese wegen UniCode da bei Bitmaps einige zeichen Fehlen und das ändern auf andere Sprachen zu aufwendig ist.
Delphi-Quellcode:
werd da irgendwie nicht schlau draus..
// setting color or with glColor
tsTextColor3f(1, 1, 1); glEnable(GL_BLEND); // activate large font tsFontBind(fLargeFontID); begin // set align to left tsSetParameteri(TS_ALIGN, TS_ALIGN_LEFT); glPushMatrix; glTranslatef(0, 0, 0); tsTextOutA(SongName); glPopMatrix; //glPrintBitmap(10, PlaystateYPos, SongName, 1); end; Die Initialisierung ist ok nur das rendern will nicht. Denke ein ViewPort problem.
Delphi-Quellcode:
soll eingentlich diese werte enthalten
glTranslatef(0, 0, 0);
Delphi-Quellcode:
habe sie auf 0 gesetzt zum testen will aber nicht. :wall:
glTranslatef(10, PlaystateYPos, 0);
gruss Emil |
Re: TextSuite will nicht
Evtl solltest du auch noch erwähnen um was es sich handelt bzw
![]() Mit der Version die ich auf meinem Rechner habe wird das Zeichnen einfacher, denn dann entfällt glPushMatrix und glPopMatrix. Allerdings ganz so einfach wie glPrintBitmap wird es nie werde, denn mein Augenmerk liegt auf Flexibilität und möglichst wenigs Einschränkungen. Zu deinem Problem. Es handelt sich bei den Buchstaben um simple Quads. Aber Quads mit Größen von bis zu 20-25 OpenGL Einheiten. Das musst du beim Zeichnen berücksichtigen. sowohl in Position als auch in der Größe. Obendrein kommt hinzu, dass Bitmapfonts direkt in den Framebuffer gezeichnet werden wärend die Quads aus der TextSuite aber 3D sind. Ich würde empfehlen, wenn du 2D Schrift haben willst, dann solltest du vorher mit glOrtho in den 2D Modus wechseln. Und dann musst du auf die passende Einheiten achten. Wie in den Beispielen. Im Zweifel bitte Fehler überprüfen. Dazu ist ![]() ![]() |
Re: TextSuite will nicht
Liste der Anhänge anzeigen (Anzahl: 2)
@Lossy
Zitat:
Ist klar das es nicht so einfach wie glPrintBitmap ist. Das ist auch mein problem. Mein problem Ich möchte wie bei glPrintBitmap die x und y position zur 'gluPerspective' erhalten bedeutet dass ich muss erst in den 'glOrtho' modus schalten und dann wieder zurück so wie bei glPrintBitmap ? Dachte ein einaches
Delphi-Quellcode:
würde reichen scheint aber nicht so zu sein.. muss dann wohl noch selbst in
glTranslatef(10, PlaystateYPos, 0);
tsTextOutA(SongName); 'glOrtho' wechseln um die Positionen zu setzen Habe mit deinen SimpleLine example experimentiert aber die zeile hat sich nie auf die von mir angegebene position gesetzt. Vielleicht bin ich auch zu doof dafür ;) EDIT: Damit das hier
Delphi-Quellcode:
überhaupt funktioniert mache ich jetzt folgendes
glTranslatef(10, PlaystateYPos, 0);
tsTextOutA(SongName); Beide Funktionen kapsel ich in eine extra procedure.
Delphi-Quellcode:
und rufe sie hier auf
procedure glPrintXY(x, y : GLFloat; fWidth, fHeight: GLFloat; text : pchar; fontset : tsFontID; Textalign: Integer);
begin tsFontBind(fontset); glDisable(GL_DEPTH_TEST); // Disables Depth Testing glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPushMatrix(); // Store The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(0,640,0,480,-100,100); glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPushMatrix(); // Store The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix glTranslated(x, y, 0); // Position The Text (0,0 - Bottom Left) glScalef(1, -1, 1); tsSetParameteri(TS_ALIGN, Textalign); tsTextOutA(text); glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glPopMatrix(); // Restore The Old Projection Matrix glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPopMatrix(); // Restore The Old Projection Matrix glEnable(GL_DEPTH_TEST); // Enables Depth Testing end;
Delphi-Quellcode:
procedure TMainForm.FormPaint(Sender: TObject);
begin glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45, ClientWidth / ClientHeight, 4, 256); glMatrixMode(GL_MODELVIEW); glLoadIdentity; // setting color or with glColor tsTextColor3f(1, 1, 1); glPrintXY(15, 13, ClientWidth, ClientHeight, 'TextSuite Sample - Single Line', fLargeFontID, TS_ALIGN_LEFT); // Check for Errors CheckError; SwapBuffers(fDC); end;
Delphi-Quellcode:
procedure TMainForm.FormResize(Sender: TObject);
begin if fInitialized then begin ReSizeGLScene(ClientWidth , ClientHeight); FormPaint(Self); end; end;
Delphi-Quellcode:
Frage mich jetzt nur warum ich so einen umweg machen muss um den Text zu positionieren
procedure ReSizeGLScene(glsWidth : GLsizei; glsHeight: GLsizei);
begin If glsHeight = 0 Then // Prevent A Divide By Zero By glsHeight := 1; // Making Height Equal One glViewport(0, 0, glsWidth, glsHeight); // Reset The Current Viewport glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glLoadIdentity; // Reset The Projection Matrix gluPerspective(45, glsWidth / glsHeight, 1, 1000.0); glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glLoadIdentity; // Reset The Modelview Matrix End; Welchen vorteil hat dann die TextSuite wenn es nur so umständlich geht ? Der gerenderte Text ist auch unansehnlich. Oder was mache ich falsch das es so ist. In 320x240 sieht man gar nichts obwohl der Font eine größe von 14 hat. In 1280 ist zu groß und total unansehnlich. gruss Emil |
Re: TextSuite will nicht
Zitat:
Aber wie gesagt. Stell dir die Zeichen als ganz normale Quads vor die an Stelle 0, 0, 0 gezeichnet werden. Wenn du dort ein Quad hinmalst wo der Text hin soll und es nicht erscheint ist was falsch. Ist es da sollte es richtig sein. Und immer auf Fehler prüfen. Hab ich geschrieben. Wenn irgendwas nicht stimmt mache ich nichts. Bzw setze nur einen Fehler. Evtl auch mal culling deaktivieren. PS: Mag sein, dass es alles etwas kompliziert erscheint aber ich denke es hat durchaus seinen Sinn. Bzw das ein oder andere ist ja auch noch in arbeit um es einfacher zu machen. Zitat:
Zitat:
|
Re: TextSuite will nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Kann es über eine Variable regeln und nur neu zeichnen wenn sich diese ändert Aber selbst dann komme ich nicht drumherum sie mehrmals aufzurufen zum beispiel wenn das Window in der größe verändert wird. Zitat:
Denn wenn ich die Bibliothek (vorschaubilder) ansehe sieht das fantastisch aus. Keine frage ;) Zitat:
Zitat:
Delphi-Quellcode:
würde ich diese auf die reale größe des Window einstellen
glOrtho(0,640,0,480,-100,100);
Delphi-Quellcode:
dann verändert sich der text in der größe nicht.
glOrtho(0,fWidth,0,fHeight,-100,100);
Habe das Sample mal hochgeladen .. Wenn du zeit findest kannst du es dir mal bitte anschauen. gruss Emil |
Re: TextSuite will nicht
Zitat:
Auch nicht vergessen solltest du, dass du noch eine GUI haben willst und wenn du noch 1-2 weitere Texte ausgeben willst, dann wechselst du mal eben locker flockig 4 Mal zwischen den Ansichten. Aber genau genommen würde auch folgendes ausreichen. Das ist jetzt auch ein Stück aus dem Anhang.
Delphi-Quellcode:
Damit kommst du mit einem einzigen glOrtho aus. Und warum funktioniert das genau so? Weil du zu Begin des Zeichnens IMMER die Perspektive setzt. Wenn alles 3D fertig gezeichnet ist kannst du die Ansicht auf 2D umstellen. Aber du brauchst sie nicht speichern und wieder zurücksetzen. Warum auch? Bei nächsten Frame setzt du sie ja sowieso wieder. So wie es in dem Anhang ist funktioniert das sicherlich auch. Allerdings machst du viel viel mehr als überhaupt nötig ist. Du sicherst Dinge und stellst sie wieder her obwohl sie gar nicht mehr benutzt werden. Und mit jedem Text steigt der Aufwand.
procedure TMainForm.FormPaint(Sender: TObject);
begin // Hier setzt du die Perspektive glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45, ClientWidth / ClientHeight, 1, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity; // Hier rufst du deine Visualisierung auf. ... // Hier ortho glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,fWidth,0,fHeight,-100,100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Text ausgeben glPushMatrix; // leider in der version noch nötig aber ab der echten 0.8 nicht mehr glTranslate(...); tsTextOutA('Blahh'); glPopMatrix; // leider noch // Text ausgeben // Gui zeichnen CheckError; SwapBuffers(fDC); end; Ich hoffe ich konnte es damit etwas besser verdeutlichen. Zitat:
Obendrein kommt noch die Art meines Zeichnens hinzu. Diese ist für pixelgenaue Darstellung ausgelegt und bei Vergrößerungen kann es passieren, dass die Interpolation von OpenGL abgeschnitten wird bzw die Zeichen teilweise ineinander fließen. Aber das könnte man bei einfachen Texten mit einem kleinen Trick umgehen. Ich sage nicht, dass es unmöglich ist. Sondern, dass es mit gewissen Risiken verbunden ist. Bzw in diesem Fall mit grafischen Einschränkungen. Denn es sieht nur wirklich richtig gut aus, wenn man Pixelgenau arbeitet. Und das ist nicht nur auf die Font Bibliothek beschränkt sondern ein generelles Problem. Deswegen wäre es vermutlich praktisch, wenn du mal genau sagst was du eigentlich damit vor hast. PS: Im übrigen ist die Größe 14 nicht vergleichbar mit der Schriftgröße 14 innerhalb von Windows. Dazu müsste dieser Wert von logischen Pixeln auf die aktuellen DPI gerechnet werden. |
Re: TextSuite will nicht
Liste der Anhänge anzeigen (Anzahl: 2)
Gut dann erkläre ich es nochmal ganz kurz
Zwei Bilder im Anhang .. Wie du unten bei den Songnamen und der Zeit sehen kannst verwende ich ein FontBitmap um die Texte auszugeben. Bei beiden bildern kann man den Text noch erkennen. Mein problem ist aber das man damit keine anderen Sprachen darstellen kann da der Fontsatz innerhalb des Bitmap auf englisch ausgelegt ist. Dazu möchte ich die TextSuite verwenden damit das möglich ist. Die Bitmaps verändern sich ja auch proportional zur größe des Fensters. Ja ich weiss das sind Bitmaps und kein text ;) gruss Emil |
Re: TextSuite will nicht
Da gibt es 2 Möglichkeiten. Entweder du setzt die Größe mit glOrtho auf einen fixen Wert (640x480). Wobei ich da aber noch auf das Seitenverhältniss achten würde. Da musst du dann aber mal testen welche Schriftgröße sich anbietet. 14 find ich zu wenig. Eher so etwas wie 21. Aber wenn die Schrift vergrößert werden muss wird es matschig. Oder wenn sie verkleinert wird dann wird sie pixelig. Das hast du bei deiner SchriftTextur jetzt auch schon. Je nach Größe und Font kommt das aber unterschiedlich stark zur Geltung.
Dann solltest du nach dem Erstellen des Fonts aber noch ein paar postprocesor hinzufügen. Die sind eigentlich nicht dafür gedacht aber sollte auch gehen.
Delphi-Quellcode:
Die sorgen dafür, dass zwischen den Zeichen mehr Platz ist und dass der RGB Wert weiß ist. Sonst können am Rand leichte schwarze Streifen entstehen, wenn die Schrift vergrößert wird. Bzw Rundungen wären abgeschnitten. Gegen das Verkleinerungsproblem gibt es nichts.
tsFontCreateCreator(...)
tsPostAddBorder4f(1, 1, 1, 1, 1, 0); tsPostAddFillColor3f(1, 1, 1, TS_CHANNELS_RGB); Oder Alternativ setzt du die Schriftgröße ins Verhältniss und benutzt für glOrtho die Größe des Viewports. Sollte sich das Fenster in der Größe verändern, dann erstellst du es im Verhältniss kleiner oder größer. Dann wäre das bei Größenveränderungen zwar nicht 100%tig gleichmäßig aber die Schrift immer Pixelgenau und entsprechend gut lesbar. Denn das Fenster wird man normal nicht immer größer und kleiner machen. Ich persönlich würde da wohl die sauberere Schrift vorziehen. Aber diese Entscheidung liegt bei dir. |
Re: TextSuite will nicht
Liste der Anhänge anzeigen (Anzahl: 2)
Danke für den Tip mit den Border..
Zitat:
das Sample sieht jetzt schon mal besser aus.
Delphi-Quellcode:
Kommt natürlich auch auf den Font an den man benutzt
procedure glPrintXY(x, y : GLFloat;
fWidth, fHeight : GLFloat; text : pchar; fontset : tsFontID; Textalign: Integer); begin tsTextColor3f(1, 1, 1); tsFontBind(fontset); tsSetParameteri(TS_ALIGN, Textalign); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,fWidth,0,fHeight,-100,100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); glTranslated(x, y, 0); glScalef(1, -1, 1); tsTextOutA(text); glPopMatrix(); end; procedure TMainForm.FormPaint(Sender: TObject); begin glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(45, ClientWidth / ClientHeight, 1, 1000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity; glPrintXY(15, 13, Width, Height, 'TextSuite Sample - Single Line', fLargeFontID, TS_ALIGN_LEFT); // Check for Errors CheckError; SwapBuffers(fDC); end; Habe zum testen mal cyberbit.ttf genommen .. geht aber nicht als standard 12MB für einen Font ist schon arg ;) Sample Ok kann ich gut mit leben Vis unidentifizierbare Blöcke von irgendwas Da ist arg was daneben. EDIT: openGL error 1282 Bilder im Anhang gruss Emil |
Re: TextSuite will nicht
Bei glPrintXY bitte ClientWidth und ClientHeight angeben. Das ist wichtig.
Der Fehler ist GL_INVALID_OPERATION. Da kann ich dir nichts sagen, da ich keinen Code sehe. Musste mal forschen was seit dem letzten mal passiert ist. Ich hätte jetzt auf deaktiviertem Blending getippt. Kann aber auch sein, dass du tsTextOutA in einem Bereich aufrufst wo das nicht erlaubt ist. Denn der erstellt beim ersten Aufruf eine Textur. Weil er Platz für die Zeichen braucht. Wenn das nicht geht kann das auch dazu führen. Font: Du musst nicht unbedingt eines mit ausliefern. Du kannst die Bibliothek auch anweisen ein Font mit einem Namen zu benutzen. Wie das im Windows auch üblich ist. Also den Parameter TS_CREATOR auf TS_CREATOR_GDI_FACENAME und bei tsFontCreateCreator bei "filename", dann 'Arial' übergeben. Aber eine kleine Warnung. Aktuell gibt es noch keine Möglichkeit fehlende Zeichen ausgleichen zu können. Der FireFox ist zum Beispiel in der Lage, bei einem Zeichen was in dem aktuellen Font nicht enthalten ist, sich dann in anderen Fonts zu bedienen. Mit anderen Worten. Das Dustimo Font ist zwar sehr schön und klein. Aber es enthält "nur" 373 Glyphen. Was aber schon viel mehr ist als andere freie Fonts bieten. Wenn du jetzt asiatische Zeichen damit darstellen wollen würdest, dann würde das nicht funktionieren, da du ausschließlich nur die in dem Font enthaltenen Zeichen zur Verfügung hast. PS: Die benötigten Zeichen bleiben im übrigen auch so lange im Speicher der Grafikkarte bis sie gelöscht werden. Es könnte also von Zeit zu Zeit nicht unpraktisch sein mal die Zeichen zu löschen. Wobei ich gesehen habe, dass ich da vermutlich sogar noch nen Speicherleck habe. Das einfachste. Font löschen und neu erstellen dann sind sie in jedem Fall weg. Denn wenn du asitische Zeichen hast, dann gibts genügend Auswahl. Aber bei 10-15 Buchstaben pro Lied könnte das Stunden der Visualisierungen bedeuten um evtl. leicht etwas zu verbrauchen. Das dürfte vermutlich so nicht mal auffallen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz