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

Aktuelle Zeit: Fr Apr 19, 2024 00:58

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Nov 28, 2015 16:04 
Offline
DGL Member

Registriert: Di Aug 23, 2005 09:15
Beiträge: 31
Programmiersprache: FPC/Delphi XE3
Dies ist ein follow-up zu meine Fragen:

"Text effizient zeichnen (Signed DIstance Fonts)"
und
"Viel Rects (Quads) zeichnen.... Mit gldrawelements?"

Das aktiver Teil meines Projekt ist am Ende, und hier ist ein Demo (Quellen incl).

http://www.stack.nl/~marcov/standaloneglv3.zip

Es wird in unsere Vision Apps genutzt um das aktiver (Kamera-)Bild mit eine Overlay darüber zu visualisieren, mit Pan und Zoom usw. Also das ist alles mehr optimiert für upload von Daten als Zeichnen weil die fast eben oft passieren, aber Upload etwa 10x langsamer ist (3ms vs 300us)

Auf eine recenter Intel GPU (Haswell, Skylake) tut es etwa eine 4MPixel Textur, 130000 Rechtecke, 15000 character ein paar Tausend Linien und Zirkel in etwa 3-4ms. (upload+zeichnen). Externe Karten sind etwas langsamer (5-7ms)

Es ist noch eine Readme.txt im Archiv, benutzt Delphi XE3 oder Lazarus+ FPC 3.1.1 (das ist Trunk, und nicht die Neuen 3.0.0 Release, weil da die Methoden in TRect(F) und TPoint(F) fehlen (konnte man vielleicht aber mit der Hand lösen )

OOPS: es funktioniert natürlich auch mit Delphi. (XE3+, nutzt generics schwer)

Es gibt auch ein (mit Lazarus gebauter) .EXE fuer diejenigen die es nicht bauen können.

Es ist NICHT multi-platform weil wir nur Windows nutzen. (win64:meistens ok).


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Dez 08, 2015 10:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Sehr schöne Demo, vorallem das man durch das Pixelbild und den Distance font zusammen sehr gut die skalierbarkeit von beiden sehen kann.

Wofür steht flushoverlay, dass brauch bei mir 89ms von insgesammt 143ms.

Kantenglättung für die Fonts wäre ein schönes feature, welches mit smoothstep Funktion recht einfach eingebaut ist.

Pixel Filter verhindert das nutzen von Mipmaps und dann wird es deutlich langsamer gegenüber linearer Interpolation, mit Mipmaps.
Man kann auch GL_LINEAR/GL_LINEAR_MIPMAP_NEAREST Interpolation für Min_Filter und GL_NEAREST für Mag_Filter verwenden.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 10, 2015 09:34 
Offline
DGL Member

Registriert: Di Aug 23, 2005 09:15
Beiträge: 31
Programmiersprache: FPC/Delphi XE3
TAK2004 hat geschrieben:
Sehr schöne Demo, vorallem das man durch das Pixelbild und den Distance font zusammen sehr gut die skalierbarkeit von beiden sehen kann.


Danke.

Zitat:
Wofür steht flushoverlay, dass brauch bei mir 89ms von insgesammt 143ms.


Uploaden der Overlay, also glbufferdata für die verschiedene Objekten.

Zitat:
Kantenglättung für die Fonts wäre ein schönes feature, welches mit smoothstep Funktion recht einfach eingebaut ist.


Es nutzt smoothstep, aber glblend ist aus nach eine Hint von dir (viewtopic.php?f=2&t=11400#p99341) um discard zu nutzen (text Typ shader Programme sind
textnew*.ssrc)

Zitat:
Pixel Filter verhindert das nutzen von Mipmaps und dann wird es deutlich langsamer gegenüber linearer Interpolation, mit Mipmaps.
Man kann auch GL_LINEAR/GL_LINEAR_MIPMAP_NEAREST Interpolation für Min_Filter und GL_NEAREST für Mag_Filter verwenden.



Ich glaube das es heute

Code:
  1. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
  2. glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST_MIPMAP_LINEAR);
  3. glTexParameteri( GL_TEXTURE_2D, GL_GENERATE_MIPMAP, 1);//glint(GL_TRUE) );
  4.  

ist.

Ich habe versucht die discard Änderungen rückgängig zu machen, aber ich bekomme keine Antialiasing. Es muss etwas anders falsch sein.

Heute ist mein text frag shader wie folgt:
Code:
  1.  
  2. uniform sampler2D   font_map;
  3. uniform float      smoothness;
  4.  
  5. const float gamma = 2.2;
  6.  
  7. in vec4 fColor;
  8. in vec2 texcoord;
  9. out vec4 outColor;
  10. void main()
  11. {
  12.   vec3 othercol;
  13.   // retrieve signed distance
  14.   float sdf = texture2D( font_map, texcoord.xy ).r;
  15.  
  16.   // perform adaptive anti-aliasing of the edges
  17.   float w = clamp( smoothness * (abs(dFdx(texcoord.x)) + abs(dFdy(texcoord.y))), 0.0, 0.5);
  18.   float a = smoothstep(0.5-w, 0.5+w, sdf);
  19.  
  20.   // gamma correction for linear attenuation
  21.   a = pow(a, 1.0/gamma);
  22. //  if (a<0.1)
  23. //  discard;
  24.   outColor.rgb = fColor.rgb;
  25.  
  26.   outColor.a = 1.0 * a;
  27. }


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 11, 2015 20:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Code:
  1. float w = fwidth(sdf);
  2. float threshold = 0.5;
  3. fColor.a = smoothstep(threshold-w, threshold+w, sdf);
  4. outColor = fColor;


dFdx/y kann man sich als Macro vorstellen, die Variable die man übernimmt wird auch für den nachbarn ermittelt und subtrahiert.
Der Shader wird immer für ein 2x2 Block ausgeführt, und dFdx nimmt sich dann sdf von sdf[x+1,y] block und subtrahiert den mit sdf[x,y].
fwidth ist die Abkürzung und ruft dFdx und dFdy auf.

Discard bringt in dem Shader nicht wirklich was, alle komplexen Aufrufe sind schon getätigt.
Gamma korrektur sollte am Ende passieren und nicht auf Alpha angewendet werden.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 51 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.098s | 17 Queries | GZIP : On ]