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

Aktuelle Zeit: So Jul 20, 2025 00:26

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Optimierung des Meshes
BeitragVerfasst: Fr Nov 02, 2007 15:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Hat sich vieleicht mal wer mit der optimierung des Meshes, in richtung sortierung für niedrigen Overdraw und/oder höchst mögliche vertexcache ausnutzung beschäftigt ? AMD hat ein Tool, welches sowas macht Tootle aber dieses ist erstmal Closed Source und nur für Windows. Ich suche Source, verständliche Algos und ähnliches zum Thema.

_________________
"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  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 02, 2007 21:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Was genau meinst du? Z-Ordering, sodass möglichst viel durch Tiefenprüfung wegfällt und sowas? Wenn ja, was machst du dann bei transparenten Flächen? (reines Interesse).

Gruß Lord 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  
 Betreff des Beitrags:
BeitragVerfasst: Fr Nov 02, 2007 23:46 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Wenn ich das richtig verstanden habe. Wird geprüft ob ein Dreieck überhaupt sichtbar ist?
Aber kostet die Prüfung nicht viel mehr Zeit als es zu zeichnen?

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 10:01 
Offline
DGL Member
Benutzeravatar

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

vielleicht könntest du einiges mit Triangle-stripping optimieren.
Damit kann man die Anzahl der Vertices im Idealfall auf fast 1/3 reduzieren.

Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 10:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich will mein mesh für overdraw unanfälliger machen, dazu muss man von aussen nach innen die faces sortieren.
Dann will ich den vertex cache nutzen, also sollten die vertice so 3mal aufwärts hinterienander verwendet 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  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 11:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn du aber von außen nach innen sortierst, was ist dann mit transparenten Flächen? (um auf meine Frage von oben zurückzukommen)

Gruß, Lord 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  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 11:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Muss man natürlich beachten und an den anfang der liste packen.
AMD hat auf dem Link, den ich gepostet habe ein Paper aber ich finde ned wirklich die Zeit und die Kraft mich da rein zu lesen.
Aus diesem Grund hab ich ja hier gefragt, ob schon wer mit rum gespielt hat.

_________________
"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  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 11:59 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Transparenz muss man so und so extra behandeln. Es geht ja nur darum die Reihenfolge der Primitive so anzuordnen dass es bei gleichem Ergebnis etwas schneller geht, weil der MRU Vertex-Cache ausgenutzt wird und viele unsichtbare Pixel vom Tiefentest verworfen werden.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
The-Winner hat geschrieben:
Transparenz muss man so und so extra behandeln. Es geht ja nur darum die Reihenfolge der Primitive so anzuordnen dass es bei gleichem Ergebnis etwas schneller geht, weil der MRU Vertex-Cache ausgenutzt wird und viele unsichtbare Pixel vom Tiefentest verworfen werden.

Genau und Tootle macht dies z.B. er sortiert die Triangle so, das die äuseren als erstes gerendert werden, damit pixel, die durch hinterliegende Triangle geskippt werden und nur einmal shader oder normale pixel pipeline durch huscht. Halt den overdraw möglichst geringt halten und versuchen dabei den Vertex Cache zu nutzen. Random meshes, also Meshes die beim expotieren raus kommen, sind in der regel völlig unperformant. Das ordentliche sortieren macht da ne riesen menge aus, gerade wenn man Shader benutzt und alpha. Ich habe Werte, von ~50% mehr Leistung gelesen.

_________________
"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  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Es scheint wohl so, dass ich selber ein Tool schreiben muss :?
Ich denke, dass die Performanteste Lösung wie folgt aussieht.
1.Sortieren der Faces nach Materials(alle Faces eines Materials zusammen legen)
2.Sortieren der Alpha Faces(von aussen zum Zentrum).
3.Sortieren der anderen Facelisten(von aussen zum Zentrum)
4.Umwandeln der Listen nach GL_Triangle_Strip(von GL_Triangles)
5.Sortieren der einzelnen Listen für Vertex-Cache nutzung(wenn keine indexbasierte zeichenroutine genutzt wird)
6.Speichern der Daten(Faces und zum schluss Alphalist)

Dann sollte man bestmöglichste aus den Mesh geholt haben, ohne Datenverlust.
Pro:
-die Alpha Faces werden zum schluss gezeichnet und machen somit keine probs
-die Anzahl der State und Befehlaufrufe wurde auf das minimalste reduziert
-das Mesh wurde auf die kleinste hardwaremögliche Format gebracht
-das Mesh hat eine sehr niedrige Overdrawrate, eigentlich garkeine mehr(sehr viele shader oder pipline aufrufe werden gespaart, dank pixel skipping)
-der Vertex-Cache wird mehr genutzt(weniger zugriffe auf den Speicher und somit mehr Leistung)

Contra:
-man muss erstmal das Tool und die Algorythmen entwerfen
-langsam und viel Zeitaufwand, wenn man generische Schnittstelle für Formate bietet oder nur für Spezielle Formate geeignet

Meine Idee wäre folgende.
Das Tool kann über Plugins die Formate lesen und schreiben.
Dann müsste man in den Plugins nur Callbacks rein stecken und im Tool steckt dann sortier und konvertierungsalgo drin.

_________________
"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  
 Betreff des Beitrags:
BeitragVerfasst: Sa Nov 03, 2007 20:32 
Offline
DGL Member
Benutzeravatar

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

hab vorher garnicht gewusst, dass es sowas wie Vertex-Caching auf Grafikkarten gibt. Wenn das so ist, kann man sich ja Triangle-Stripping fast sparen...

Wenn ich das Paper von Ati richtig verstanden habe, wird bei der Mesh-Optimierung das Mesh in einzelne zusammenhängende Regionen unterteilt.
Das macht durchaus Sinn, man versucht Vertices, die in mehreren Dreiecken vorkommen, möglichst hintereinander aufzurufen, damit sie auch im Cache bleiben und nicht nochmal neu berechnet werden müssen.

Andererseits braucht man dann nicht mehr eine Z-Sortierung für die einzelnen Flächen sondern kann diese für die Regionen machen, da in großen Modellen nebeneinanderliegende Triangles mit hoher Wahrscheinlichkeit in einer Ebene liegen und sich beim Zeichnen daher kaum überlappen.

Damit kann man auf jeden Fall eine Menge Rechenzeit sparen.

Viele Grüße
dj3hut1

P.S. ein Algorithmus könnte vielleicht so aussehen :

Code:
  1. Heuristischer Algorithmus (ohne Berücksichtung von Material oder transparenten Flächen)
  2.  
  3. Wähle n verschiedene Dreiecke zufällig auf dem Mesh (als Startpunkte für n verschiedene Regionen)
  4. Bis alle Dreiecke gefunden
  5.     Für jedes Start-Dreieck/Region
  6.         suche das Nachbardreieck, das am ehesten mit auf der Ebene liegt (z.B. durch Normalenvergleich)
  7.         und nicht zu weit vom Zentrum der Region entfernt ist (abhängig von der Größe des Vertex-Caches)
  8.         und noch nicht zu einer Region gehört und füge dieses zur Region hinzu


Alternative :

Code:
  1. Bis alle Dreiecke gefunden
  2.     Wähle ein zufälliges Dreieck, das noch nicht zu einer Region gehört
  3.  
  4.     Suche alle Nachbardreiecke, die am ehesten mit auf der Ebene liegen (z.B. durch Normalenvergleich)
  5.     und nicht zu weit vom Zentrum der Region entfernt sind (abhängig von der Größe des Vertex-Caches)
  6.     (und/oder das selbe Material wie das Startdreieck besitzen)
  7.     und noch nicht zu einer Region gehören und füge diese zur Region hinzu


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]