Einstieg OpenGL => Textausgabe

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Ich habe gestern im Internet gesucht nach Textausgabe in OpenGL,
das scheint ja garnicht so einfach zu sein.

https://forum.lazarus.freepascal.org/in ... ic=40306.0

https://learnopengl.com/In-Practice/Text-Rendering

https://git.bergmann89.de/opengl/TextSuite

Vor lauter Bäumen sehe ich da den Wald nicht.
Ich versuche mal, irgendein Programm-Example zu finden,
das auch tatsächlich compiliert und eine funktionierende EXE erzeugt.

Aber bislang verdödel ich hier meine Zeit
mit googeln, lesen, und hab noch nichts handfestes gefunden .. :(

Hat jemand eine Idee, wo ich mich umschauen sollte ?

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Ausgerechtet das "mtext" Example aus diesem Repository "funktioniert nicht".
Es compiliert, zeigt aber keinen Text an. :(

https://github.com/neurolabusc/OpenGLCoreTutorials

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Nach längerer Suche, von Handoko:
https://forum.lazarus.freepascal.org/in ... ic=35850.0

Das compiliert, und zeigt Text an, aber bei mir etwas matschig ..
Screenshot (613).png
Screenshot (613).png (16.95 KiB) 6211 mal betrachtet
Dateianhänge
Test.zip
(155.25 KiB) 54-mal heruntergeladen

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Einstieg OpenGL => Textausgabe

Beitrag von Mathias »

Das compiliert, und zeigt Text an, aber bei mir etwas matschig ..
Versuche mal dies.

Code: Alles auswählen

//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
PS: Unter Linux schmiert das Programm ab.
Dis kann so behoben werden:

Code: Alles auswählen

procedure TForm1.FormActivate(Sender: TObject);
begin
//  LoadFontBitmap;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadFontBitmap;
end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Einstieg OpenGL => Textausgabe

Beitrag von Mathias »

Und es hat noch einen Fehler, Wen man die BMP anguckt, hat die graue Trennlinien zwischen den Zeichen, die sind sichtbar.

Wie du schon schreibt, ist Textausgabe unter OpenGL gar nicht so einfach.
Es geht alles über Texturen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Mathias hat geschrieben: Mi 5. Jun 2024, 13:44 Unter Linux schmiert das Programm ab. Dis kann so behoben werden:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadFontBitmap;
end;  
LoadFontBitmap() in FormCreate() verschieben macht hier unter Windows keinen Unterschied, läuft genauso.

Mathias hat geschrieben: Mi 5. Jun 2024, 13:44
Das compiliert, und zeigt Text an, aber bei mir etwas matschig ..
Versuche mal dies.

Code: Alles auswählen

//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
Das sieht sogar etwas schlechter aus, auf meinem Bildschirm.

Kann aber daran liegen daß ich hier keine native Auflösung habe.
Also das DVI-Signal hat schon die volle physikalische Auflösung des Monitors,
aber Windows skaliert für mich auf 125% hoch.
Screenshot (614).png
Screenshot (614).png (14.77 KiB) 6186 mal betrachtet

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Mathias hat geschrieben: Mi 5. Jun 2024, 13:54 Und es hat noch einen Fehler, Wen man die BMP anguckt, hat die graue Trennlinien zwischen den Zeichen, die sind sichtbar.
Handoko hatte das Beispiel auch nur ins Forum gestellt um zu zeigen wie das im Prinzip geht.

Mit diesem BMP Zeichensatz kann man aber tatsächlich keinen Blumentop gewinnen.
Wenn Du Dir das Bild in hoher Auflösung anschaust, das hat auch Artefakte,
die nach einem Umweg über JPEG aussehen ... :D
Mathias hat geschrieben: Mi 5. Jun 2024, 13:54 Wie du schon schreibt, ist Textausgabe unter OpenGL gar nicht so einfach.
Es geht alles über Texturen.
Aber zumindest kann ich jetzt mal eine Prototyp-Oberfläche bauen.
Und dann schauen ob ich meine User-Bedienoberfläche so hinbekomme, wie ich mir das vorstelle.

Außerdem muß ich schauen, wieviel CPU/GPU-Last das Programm dann mit OpenGL erzeugt.
Meine Software läuft 7/24 das ganze Jahr durch,
da muß ich schon aufpassen daß das Programm kein Stromfresser wird ..

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Einstieg OpenGL => Textausgabe

Beitrag von Mathias »

Ich habe noch einen anderen Lösungsansatz.
Die Font-Bitmap direkt im Programm erzeugen.

Code: Alles auswählen

function TForm1.CreateFontBitmat: TBitmap;
const
  size = 32;
  FontCount = 94;
var
  i: integer;
begin
  Result := TBitmap.Create;
  Result.Width := size * FontCount;
  Result.Height := size;

  Result.Canvas.Font.Color := clRed;
  Result.Canvas.Font.Name := 'monospace';
  Result.Canvas.Font.Height:=size div 2;
  for i := 0 to FontCount - 1 do begin
    Result.Canvas.TextOut(I * size, 0, char(i + 32));
  end;
end; 
Da ich es mit OpenGL3.3 und Shadern gelöst habe, ist das Rendering sehr kompakt.
Quasi den String in einem schnurz direkt an die GPU übergeben.

Meine ganze Source: https://github.com/sechshelme/Lazarus-O ... /82_-_Font
Die readme.md bitte nicht beachten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Mathias hat geschrieben: Mi 5. Jun 2024, 17:41 Da ich es mit OpenGL3.3 und Shadern gelöst habe, ist das Rendering sehr kompakt.
Quasi den String in einem schnurz direkt an die GPU übergeben.
Sowas hatte ich gesucht, auch in Bruchstücken gefunden,
aber die anderen Fundstellen ließen sich - bei meinem Wissensstand - nicht zum laufen bringen.
Werde ich gleich mal ausprobieren !

Vielen Dank !

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Einstieg OpenGL => Textausgabe

Beitrag von Mathias »

Werde ich gleich mal ausprobieren !
Dann musst du noch folgende Package installieren.
Da ist alles drinnen, was es braucht für Shader laden, Matrix-Funktionen, etc.
Mit dieser Package müssten alle Beispiele kompilierbar sein, ausser die im Ordner Versuche

https://github.com/sechshelme/Lazarus-O ... ster/units
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Ich habe jetzt erstmal das on-the-fly erzeugen der Font-Bitmap in das Test-Projekt eingebaut.
So sehen die Buchstaben und Zahlen schonmal deutlich besser aus.

Screenshot (616).png
Screenshot (616).png (61.17 KiB) 6145 mal betrachtet
Dateianhänge
Test BitmapFont.zip
(159.38 KiB) 57-mal heruntergeladen

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Mathias hat geschrieben: Mi 5. Jun 2024, 19:56 Dann musst du noch folgende Package installieren.
Da ist alles drinnen, was es braucht für Shader laden, Matrix-Funktionen, etc.
Da werde ich mich die nächste Zeit mit befassen,
auf jeden Fall schön daß für meine ersten Gehversuche
jetzt etwas Substanz da ist. Danke !

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Einstieg OpenGL => Textausgabe

Beitrag von Mathias »

Ich habe jetzt erstmal das on-the-fly erzeugen der Font-Bitmap in das Test-Projekt eingebaut.
So sehen die Buchstaben und Zahlen schonmal deutlich besser aus.
Da gebe ich dir auch noch einen Rat. Ordne die Zeichen alle auf einer Zeile ein. Dann musst du nicht das x und y berechen. Dann reicht ein x.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Mathias hat geschrieben: Do 6. Jun 2024, 17:11 Da gebe ich dir auch noch einen Rat. Ordne die Zeichen alle auf einer Zeile ein. Dann musst du nicht das x und y berechen. Dann reicht ein x.
Ich habe den Code an das Beispiel-Projekt von Handoko angepaßt.
Und man kann jetzt im TImage sehen, wie die Zeichen angeordnet sind.

Du hast aber völlig recht, die bessere Vorgehensweise ist, alle Zeichen nebeneinander in's Bitmap zu "schreiben".

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: Einstieg OpenGL => Textausgabe

Beitrag von PeterS »

Das Beispiel-Projekt "mtext.lpi" aus OpenGLCoreTutorials-master wäre ja interessant.
Aber das ist auch ungepflegt, sollte so aussehen:

msdf.png
msdf.png (49.12 KiB) 6079 mal betrachtet


Aber ich habe nur das hier, unter Windows:
Screenshot (982).png
Screenshot (982).png (12.86 KiB) 6079 mal betrachtet


Und das "Gekrackel" sieht man auch nur weil ich den Code "gehackt" habe:

( ich habe if metrics.M[asci].xadv = 0 then continue; auskommentiert )

glmtext.pas

Code: Alles auswählen

procedure TGLText.TextOut(x,y,scale, angle: single; s: string); overload;
var
...
begin
 ...
 ...
  for i := 1 to length(s) do begin
      asci := ord(s[i]);
      //if metrics.M[asci].xadv = 0 then continue; //not in dataset
      CharOut(x,y,scale,rx,asci);
      Rot(x,y, (scale * metrics.M[asci].xadv),0, rx, x, y);
  end;
end; //TextOut() 

Antworten