Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
ich wollt ma fragen wie ich in OpenGL einen Text ausgeben kann. Ich hab schonma n paar zahlen ausgegeben, da hab ich eine Textur mit allen Ziffern drauf gemacht und dann einafch nur die textur entsprechend verschoben, aber ich glaub das ist bei Buchstaben und längeren Texten nicht grad effektiv, oder?
Kann mir jemand erklären wie ich sowas mach, am besten mit Code als Anschauung oder gibt es vlt. sogar ein Tutorial dazu?
also mit einer Fonttextur zu arbeiten ist ich glaube der beste Weg den du gehen kannst und wenn du nach Texture Font Generator oder so googelst findest du auch einige Programme mit denen du solche Texturen erstellen kannst.
Bei langen Texten kannst du das ganze in ein FBO zeichen um nicht so viel Performance zu verlieren.
Aber das einfachste ist warscheinlich wenn du dir mal dises Projekt von Lossy eX anschaust.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Um genau zu sein gibt es gar keinen sinnvollen anderen Weg als über eine Textur. Die bisherigen Methoden hatten alle irgendwo so ihre Probleme. Diese Möglichkeiten existieren also auch schon seit ca 13 Jahren. Also seit anbegin von OpenGL.
Diese Texturtools arbeiten sehr sehr häufig mit einem 16x16 Raster was natürlich die Anzahl der möglichen Zeichen stark einschränkt und sehr viel Platz in den Texturen verschenkt. In meinem Projekt erstelle ich nur die benötigten Zeichen und packe sie dort hin wo Platz ist. Dadurch werden ca 90% der Texture auch wirklich genutzt. Man benötigt aber dann die passenden Fonts auf den Rechnern wo die Anwendung laufen soll.
FBO ist sicherlich auch möglich allerdings lohnt sich das vermutlich nur bei wirklich großen Texten. Und dann darf man die Texte natürlich nicht dauerhaft neu erstellen. Sonst hat man mehr Arbeit ohne die Vorteile überhaupt nutzen zu können. Aber im normalfall denke ich nicht, dass das nötig sein wird. Denn in der Regel hat man eine Textur und zeichnet X Quads. Ähnlich wie ein 3D Model. Eine Textur und X Flächen. Nur sind Modelle meist viel komplexer. Also mit anderen Worten. Da würde ich mir vorerst nicht so die Gedanken machen.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI, hab's mir ma durchgelesen und hab jetzt folgendes Problem.
Ich will sowas wie ne Spechblase machen und will dazu Text auf eine Texture Rendern und beides dann in einer 2. Textur ablegen. Aber irgendwie komm ich mit der BlendFunc nich so richtig klar, ich hab schon mehrere sachen ausprobiert, aber entweder die Sprechblase verfärbt sich, oder der text wird nicht richtig angezeigt. So hab ich das gemacht:
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ist das unbedingt nötig daraus eine Textur zu machen? Denn das RenderToTextur ist nicht gerade das Schnellste.
Deine Sprechbalsentextur wird aber nicht gebunden. Denn das rufst du zwischen glBegin und glEnd auf. Damit wird der Aufruf ignoriert, da das nicht erlaubt ist. Ansonsten kann es natürlich immer sein, dass noch eine andere Texur aktiv ist, da du als letztes fTexture bindest. Außerdem kopierst du nur RGB Daten in fTexture. Damit enthält sie keine Transparenz mehr. Was sicher nicht so praktisch ist, wenn du sie Später irgendwo darstellen möchtest.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Lossy eX hat geschrieben:
Ist das unbedingt nötig daraus eine Textur zu machen?
Muss nich sein, aber das is der einzige weg, der mir eingefallen ist...
Lossy eX hat geschrieben:
Deine Sprechbalsentextur wird aber nicht gebunden. Denn das rufst du zwischen glBegin und glEnd auf. Damit wird der Aufruf ignoriert, da das nicht erlaubt ist.
Also wenn ich das Blending aus mach, und nur meine Sprechblase zeichne wird sie angezeigt, auch wenn ich das im glbegin/glEnd-Block drin hab?!
Lossy eX hat geschrieben:
Außerdem kopierst du nur RGB Daten in fTexture. Damit enthält sie keine Transparenz mehr. Was sicher nicht so praktisch ist, wenn du sie Später irgendwo darstellen möchtest.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Moin,
ich hab's jetzt auch ma FBO's probiert, aber da man dort ja kein AA hat sieht die Schrift furchtbar aus! Dann hab ich mich an PixelBuffer gamacht, aber:
liefert immer 0 zurück. Hab mich dabei an das Tutorial von Sascha Willems gehalten.
Dann hab ich versucht meine fTexture so umzubauen, das ich ihr auch die Alpha-Werte übergeben kann: Hab sie mit dem Parameter GL_RGBA erzeugt und dann bei glCopyTexImage2D auch GL_RGBA übergeben, aber irgendwie funzt das trotzdem nich?!
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Bergmann89 hat geschrieben:
Lossy eX hat geschrieben:
Ist das unbedingt nötig daraus eine Textur zu machen?
Muss nich sein, aber das is der einzige weg, der mir eingefallen ist...
Tut mir leid, wenn ich das so direkt sage. Aber was zum Geier hast du eigentlich vor? Irgendwie verstehe ich nicht was du damit bezweckst. Du willst doch eine Sprechblase ausgeben, oder? Das Einfachste wäre die Blasentextur zu zeichnen und dann den Text darüber zu zeichnen. Und langsam wird das so auch nicht sein. Klar es ist schneller ein texturiertes Quad zu zeichnen anstelle von 200. Aber die sind auch kleiner und die Karten haben kein Problem damit. Ich verstehe nicht warum du mit allen Mitteln versucht es in eine Textur zu packen.
Warum die Schrift in dem FBO nicht gut ausgesehen hat kann ich nur raten. Aber die Zeichen sind nichts weiter als texturierte Quads. Also weise ich da mal alle Schuld von mir.
RenderToTexture: Du bräuchtest da höchstwahrscheinlich einen Alphakanal und der muss für den RenderContext explizit erstellt werden. Und selbst dann kann sich der Treiber darüber hinweg setzen. Weswegen ich das nur verfolgen würde, wenn es wirklich wirklich zwingend notwendig ist. Was ich da gerade so gar nicht sehe.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
irgendwie war ich verwirrt: ich hab mir das SimpleBlock_VCL Beispiel angesehen. Und dachte nun, das man den TextBlock bloß in 2D rendern kann, das das auch in 3D geht wusste ich nich ^^ Auf jedenfall hab ich's jetzt umgebaut. Jetzt hab ich aber irgendwie immer schwarze Striche vor den Buchstaben. wie bekomm ich die weg?
So hab ich das angestellt:
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Die TextBibliothek ist eher für 2D ausgelegt und bei 3D kann es eben zu diesen Problemen kommen. Dafür habe ich für später noch was geplannt. Aktuell kannst (musst) du mit einem Trick arbeiten. Und zwar ist das Problem, dass die Buchstaben aktuell direkt nebeneinander liegen und das führt eben zu diesen Strichen, da die Textur geglättet wird und verläuft.
Wenn deine Zeichen nur weiß sind und du über die OpenGL Farbe deren farbe bestimmst, dann kannst du mit einem tranparenten Schatten arbeiten. Also tsPostAddShadow. Als Position wählst du 0, 0. Für den Radius wählst du 1 oder so. Und als Farbe weiß. Wichtig dabei. Der Alphakanal MUSS den Wert 0 bekommen. Den Schatten richtest du ein nachdem du das Font erstellt hast.
Damit würden um die Zeichen transparente Pixel entstehen. Und der Weichzeichner würde dann zu transparenten Texturen blenden. Es kann aber sein, wenn du die Schriften mit der Farbe weiß oder etwas helles benutzt, dass dann wiederrum andere Fehler auftauchen. Das kann man beheben aber das spare ich mir mal, da ich nicht genau weiß wann das auftritt. Liegt aber alles so ein bisschen mit dem Weichzeichner von OpenGL zusammen. Sind leider nur hacks. Aber ich weiß was man machen müsste um es richtig zu machen. Ist aber mehr arbeit im code. Deswegen derzeit nur hacks.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
hab noch ein Problem: Normalerweiße is ja die Sprechblase nur so groß, das der Text gerade so rein passt.
Gibt es ne Funktion mit der ich rausfinden kann, wieviel von dem Textblock beschrieben wurde, bzw. weiviele Zeilen?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn du innerhalb des TextBlockes tsTextGetHeight, mit nil als Parameter aufrufst, bekommst du die aktuelle Höhe zurückgegeben. Dazu kannst du auch mal in das AdvancedBlock Beispiel schauen. Dort lese ich den Wert aus und übertrage ihn auf den nächsten Block.
Wenn du wissen möchtest wie groß ein Block ist, ohne etwas auszugeben, kannst du auch das Flag TS_BLOCKFLAG_CALC_SIZE als Flag bei tsTextBeginBlock angeben. Dann wird nur die Größe berechnet.
PS: tsTextGetWidth sollte entsprechend die Breite zurückliefern.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Gut, danke das hilft mir weiter.
Hab grad noch ein Problem entdeckt: Ich hab mit ne Klasse erstellt, mir der ich die Fonts ganz
einfach erstellen und Text schnell ausgeben kann. Aber wenn ich 2 Fonts mach, und die Schrift
vom 1. Veränder, dann ändern sich Beide?! So hab ich das gemacht:
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Joahr. Des Rätsels Lösung in dem Bild über den Aufbau der Bibliothek. Du erstellst bei dir jeweils einen Kontext und ein Font.
Du solltest aber besser nur einen TextSuite Kontext pro OpenGL Kontext erstellen. Und entsprechend den Renderer nur ein einziges Mal setzen. Denn sobald ein Font existiert kann man das sowieso nicht mehr ändern. Die Kontexte sind eigentlich nur da um in einem anderen Thread zu arbeiten oder in einem anderen OpenGL Kontext.
PS: Wenn du neue Fragen hast wäre es nett, wenn du der Übersicht halber ein neues Thema machst. Auch wenn vermutlich eher weniger darauf antworten werden wäre es besser. Danke.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
mit einem Kontext gehts jetzt! Hab aber schon wieder n neues Problem xD
Irgendwie wird die Hohe und die Breite des TextBlocks nicht mehr richtig ausgelesen, obwohl es am Anfang ma ging.
Hab eigentlich auch nix verändert...
Code:
Width = 300;
Height = 200;
Ich sag ihm der Block soll 300x200 groß sein, aber fW enthält nach dem Aufruf 591?! Obwohl 300 doch eig. das Maximum ist, oder?
Die Höhe mit 28 haut hin, das entspricht genau einer Zeile. Aber was bei der Breite falsch gelaufen ist weiß ich nich!
Mitglieder in diesem Forum: 0 Mitglieder und 4 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.