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

Aktuelle Zeit: So Apr 28, 2024 20:04

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



Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Sa Jan 24, 2015 21:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey Leute,

ich implementier grad n paar neue Features für die TextSuite. Unter anderem mal nen aktuellen OpenGL und OpenGL ES Renderer und FreeType Fonts. Die TextSuite legt die Bild-Daten eines Chars zur Zeit in einer Textur ab. Dabei werden mehere Chars in eine große Textur gepackt. Um zu wissen wo noch Platz in der Textur ist, speichert die TextSuite für jede Zeile in der Textur den noch freien Platz in einer Linked List. Bsp.:
Code:
  1. X = belegter Texel O = freier Texel
  2. XXXOOOXXXX  liste mit einem Item (start=3, count=3)
  3. XXXOOOXXOO  liste mit zwei Items (start=3, count=3), (start=6, count=2)
  4. OOOOOOOOOO  liste mit einem Item (start=0, count=10)
  5. XXXXXXXXXX  leere liste
Wenn ein neues Teilbild eingefügt werden soll, dann geht sie Pixel für Pixel durch die Textur und prüft Anhand der Listen-Einträge ob das neue Bild Platz in der Textur hat. Das muss jedemal gemacht werden, wenn ein Buchstabe gerendert werden soll, der bis jetzt noch nicht im System bekannt ist. Ich finde diese Methode relativ aufwendig, mir ist bist jetzt aber auch nichts besseres eingefallen. Deshalb wollte ich euch mal fragen, ob vlt jmd eine Idee hat wie man das möglichst performant lösen kann. Sowohl vom Speicherverbrauch, als auch von der Laufzeit her.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 24, 2015 22:43 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Wofür braucht man das, wenn es Pango gibt?

EDIT: Clarification:

Pango sollte schnell genug sein den Text in Echtzeit zu rendern. Weiterhin kann man das ganze prima cachen und muss sich keinerlei Gedanken um irgendwas mehr machen.

=> TextSuite unnötig. IMO.

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 24, 2015 23:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

Pango kannte ich bis jetzt noch nicht. Hab mir mal eben ein Beispiel angesehen. Dort wird ein Text in eine Textur gerendert. Alles schön und gut, aber dann benötige ich für jeden beliebigen Text eine Textur. Die TextSuite cached nur die Buchstaben und rendert den Text dann dynamisch. Das hat meiner Meinung nach ein paar Vorteile: man kann alles in einer (oder ggf. mehreren) großen Texturen (2048px^2) speichern und braucht nicht für jeden Text eine extra Textur, was sich positiv auf den Speicherverbrauch auf der Graka auswirken sollte. Außerdem hat man weniger Verwaltungsaufwand was die Zuordnung von Texture zu Text betrifft. Kleiner Nachteil bei dieser Methode: minimal höherer Rechenaufwand, weil jeder Buchstabe einzeln gezeichnet werden muss.

Wie meinst du das mit in Echt-Zeit rendern? In jedem Render-Loop den Text mit Pango in ein Buffer rendern, ne neue Textur erstellen, die Daten hochladen und dann die Textur rendern? Das sollte alles andere als schnell sein! Oder hat Pango die Möglichkeit gleich auf einen OpenGL Context zu rendern? Wie gesagt: ich kannte die Lib bis jetzt nicht.

€: was ist mit Text-Blöcken. Die TextSuite kann ja auch ganze Blöcke mit korrektem Zeilenumbruch rendern. Macht das Pango auch, oder kann das nur Single-Lined-Text?

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 12:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Pango ist dahingehend (bestimmt, ich kenne die TextSuite nicht) besser. Es kann auch mit arabisch (right-to-left) umgehen, macht korrektes Hinting und Kerning etc.etc.. Pango rendert ungefähr alles an Text, was du auf deinem Linuxdesktop findest (außer du hast KDE laufen). Nur Glyphen in eine Textur rendern wird halt nie ausreichen um ordentlichen Text zu rendern. Da muss man sich dann entscheiden ob man schönes Textlayout will oder einfaches Design (einfach in dem Sinne, dass man sich nicht viel Gedanken darum machen muss, wie man das jetzt so optimiert bekommt, dass die Bandbreite zur GPU nicht zum Flaschenhals wird, wenn man öfter Textteile updaten muss).

Ich habe mich damit für ManiacLab ja auch beschäftigt gehabt, und bin einen recht ähnlichen Entwicklungsweg gegangen: Erst hab ich mir FreeType angeschaut (da es ja C++/Python ist kam TextSuite nicht in Frage), festgestellt, dass Textrendering alles andere als trivial ist (ich sag nur Right-To-Left, Kerning, Hinting, Combining Characters, …) und überlegt, ob ich das selber baue oder lieber Pango verwende. Jetzt weiß ich nicht mehr, ob da noch ein Zwischenschritt war, wo ich Pangotextschnipsel in Texturen gepackt habe (ich glaube schon) und die dann via OpenGL gerendert habe, aber letztenendes zeichne ich einfach meine ganze GUI in Cairo und lege die über OpenGL drüber. Wobei ich mir dahingehend demnächst mal Qt anschauen werde. Ich habe gehört die können inzwischen nach OpenGL rendern.

Bonus bei Pango: es hilft einem auch, durch den Text zu navigieren. Das wird ja bei Unicode nicht mehr trivial, wenn man dann ein visuelles Zeichen hat, das aus fünf oder sechs Codepoints (siehe Combining Characters, Abschnitt Mehrdeutige Darstellungen für ein Beispiel) zusammengebaut ist. Da kann man nicht einfach einen Codepoint im Unicodestring vor/zurück gehen, wenn die Pfeiltasten gedrückt werden. Pango hat da Methoden, mit denen man sagen kann, ich möchte jetzt von dieser Cursorposition ein visuelles Zeichen nach links/rechts und es sagt einem dann, an welchem neuen (Byte-)Offset im Bytestring man ist (und daraus kann man sich dann auch die visuelle Position errechnen lassen, z.B. um einen Caret anzuzeigen). Et vice versa.

Pango kann in mehrere Backends rendern, aber ich habe bisher nur das Cairo-Backend ausprobiert (damit kann man in einen RGBA-Buffer im Speicher rendern, den man dann an die GPU schicken könnte; man kann auch problemlos mehrere Textschnipsel in die Textur packen).

viele Grüße,
Horazont

p.s.: On-Topic: Das Problem, was du zu lösen versuchst, heißt 2D-Binpacking und ist NP-Hard. Ich habe damals als ich das in C++ gemacht habe, eine Lib gefunden, die für sowas gemacht ist, dann aber nicht weiter verwendet, weil ich wie gesagt auf Cairo für die GUI umgestiegen bin. In deren Source kannst du dich ja mal umschauen.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Okay, überzeugt :mrgreen:
Ich werd erstmal paar kleine Test-Anwendungen mit Pange/Cairo schreiben und mir nen Klassen-Wrapper drum rum bauen. Dann werd ich sehen, ob und wie das in unser Projekt passt. Zur Zeit cachen wir den Großteil der Texte aus der TextSuite auch in ner Textur zwischen. Das sollte ja mit Pango/Cairo dann genauso gehen. Ich muss mir nur mal angucken ob man da auch eine Textur nehmen kann die kleiner ist als der zu rendernde Text, z.B. wenn der Text in einer Textbox größer ist als der angezeigte Bereich.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 13:58 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
Zitat:
Ich muss mir nur mal angucken ob man da auch eine Textur nehmen kann die kleiner ist als der zu rendernde Text, z.B. wenn der Text in einer Textbox größer ist als der angezeigte Bereich.


Warum nicht einfach Texturkoordinaten verschieben oO?

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 14:02 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
@bergmann
Du baust an Textsuite rum!?
Habe vor kurzem noch davon geschwärm, jetzt habe ich es gerade aus meinem Projekt geworfen und durch etwas Selbstgebautes ersetzt.
Vorbild war dies Projekt. Ich trianguliere mir die Zeichen. Dazu benutze ich einen Algo aus Graphics32, der Text zu einem Polygon macht. Das Polygon trianguliere ich dann mit gluTess. Eigentlich funktioniert das ganz gut. Aber man kann merken, dass sich das Projekt bei viel Text etwas langsamer rendern lässt (könnte sich aber verbessern lassen). Ansonsten ist der Codeumfang wesentlich übersichtlicher.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 14:28 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
"gluTess" gibt es nicht mehr in modernen OpenGL.

Für mich persönlich wäre eine Bibliothek wie Pango keine Option. Die Dependency wäre mir zu groß. Der Speicherverbrauch zu hoch. Der Initialisierungsaufwand vor dem Rendern zu groß. Perspektive, Animationen und Effekte in der Szene zu umständlich.

Da verzichte ich lieber für das Erste auf Right to Left und Tausche Hinting mit schnellen dynamischen Effekten durch Distance Fields ein.


Zuletzt geändert von OpenglerF am So Jan 25, 2015 18:20, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 14:46 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Zitat:
"gluTess" gibt es nicht mehr in modernen OpenGL.
Okay, ich laufe noch auf dem alten System. Läßt sich aber einfach durch andere Triangulierer ersetzen (auch ohne Performanceverlust).


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 16:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
@end: wenn Pango/Cairo schlau ist, dann rendert er nur die Zeichen die in der Textur am ende auch zu sehen sind. Das spart Speicher und CPU-Zeit. Alternative wäre natürlich alles in eine Textur packen und die dann entsprechend zurechtschneiden.

@Jens01: die Zeichen mit Geometry abzubilden find ich nicht so schön. Das macht sich mit dem Anti-Aliasing doof und kostet auch bisl mehr als ne einfache Textur.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 16:40 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Zitat:
Das macht sich mit dem Anti-Aliasing doof und kostet auch bisl mehr als ne einfache Textur.
Ja, etwas zackig ist das manchmal. Bei TextSuite machte das aber auch etwas Probleme auf eine andere Art. Das war das machmal etwas verzerrt.

Und nein, das ganze hat mich nichts gekostet. :lol:
Ich erstelle jedes Zeichen nach Bedarf einzeln und nutze das dann immer wieder, wenn es vorkommt. Das Erstellen kostet also nicht so viel. Das Rendern könnte etwas aufwendiger sein. Es ist aber noch gut im Bereich des Akzeptablen.

Schönen Sonntag.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Vor allem verliert man, wenn man die Glyphen über echte Geometrie rendert, jegliches Hinting. Dafür muss man zum Erstellzeitpunkt der Geometrie schon wissen, mit welcher Auflösung (pt pro pixel) und Größe (pixel) der Glyph gezeichnet wird. Gegebenenfalls wird das auch im Rasterizer der Textrenderer gelöst, bin mir da nicht sicher. Jedenfalls haben Fonts ganze Programme eingebettet, die sich nur damit befassen, das Hinting zu implementieren.

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hab ein rudimentäres Test Programm geschrieben und muss genau das festellen was OpenglerF gesagt hat: ich brauch abertausende von libs. Ich hab mittlerweile über 23 libs geladen und es läuft immer noch nicht, weil immer noch welche fehlen. Auf Linux mag das schön un gut sein, aber wenn ich unter Windows die ganzen libs von linux mit drauf packen muss is doof :/

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 19:52 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Einfach mal ein Screenshot von meinen geometrischen Fonts, damit wir über dasselbe sprechen:

Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 25, 2015 20:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,

kann bei Geometrie-Fonts das Aliasing-Problem nicht mit den bekannten Techniken (GL_POLYGON_SMOOTH, Alphablending) gelöst werden?

Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 24 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.046s | 19 Queries | GZIP : On ]