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

Aktuelle Zeit: Fr Mär 29, 2024 01:53

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: So Jul 19, 2015 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Habe ich einen grossen Vorteil mit Triangle-Strip, gegenüber mit Triangle ?

Das es weniger Speicher braucht, ist mir klar.

Aber was mache ich mit der Normalen ?
Bei eine Kugel oder Zylinder ist dies kein Problem, da bei jedem Punkt die Normale gleich ist.
Aber bei einem Würfel, kann ich dieses Problem kaum umgehen oder ?

Mit glDrawElements sieht es noch schlimmer aus, spart enorm Speicher, aber eben die Normale.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Mo Jul 20, 2015 13:06 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Hallo Mathias,

Zeichne doch z.B. alle 6 Seiten des Würfels mit einem separaten Strip, spart immerhin ein Drittel.
Bei einem Würfel brauchst Du Dir aber um den Speicher eh keine Gedanken machen.
Bei einem großen Mesh sparst Du Dir aber fast zwei Drittel, was u.U. sehr viel sein kann.

Grüße,
Vinz

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Mo Jul 20, 2015 16:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Zwei Vertices, die sich in der Normale oder irgendeinem anderen Vertexattribut unterscheiden, sind halt zwei verschiedene Vertices. Dementsprechend musst du auch zwei Vertices speichern. Indexbuffer oder TriangleStrips helfen dir da nicht weiter. Bei 3D-Modellen ist es aber meistens so, dass Vertices, die an der selben Position sind, auch gleiche Texturkoordinaten und Normalen haben ("runde" Stellen statt harter Kanten). Daher ist es ratsam, Indexpuffer einzusetzen. Das spart Speicher, ist schneller zu rendern und einfach zu implementieren.

Noch mehr optimieren könnte man, indem man Indexbuffer UND TriStrips verwendet. Der Gewinn an Speicherplatz und Performance dürfte aber nicht sehr groß sein, da der Indexpuffer im Vergleich zum Vertexpuffer bereits klein ist. Jedoch ist dieses Vorgehen sehr aufwändig: Einerseits ist es nicht trivial, aus einem bestehenden Mesh eine effiziente TriStrip zu generieren. Andererseits benötigt man das Mesh vielleicht nicht nur zum Rendern, sondern auch um Kollisionsberechnungen o.ä. durchzuführen. Das wird alles komplizierter, wenn man die Indizes nur als TriStrip vorliegen hat.

Wenn du GL_TRIANGLE_STRIP einsetzt, solltest du darauf achten, dass du am Ende nicht mehr DrawCalls brauchst als mit GL_TRIANGLES. Also nicht ein Mesh in mehrere TriangleStrips unterteilen. Das kannst du in jedem Fall erreichen, notfalls durch Dreiecksdegeneration (Dreiecke mit Fläche=0 einbauen). Dass solche Optimierungen bei solch primitiven Objekten wie Würfeln nicht sinnvoll sind, ist glaube ich klar.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Mo Jul 20, 2015 17:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Zeichne doch z.B. alle 6 Seiten des Würfels mit einem separaten Strip, spart immerhin ein Drittel.

Du meinst, ich sollte 6 mal glDrawArrays(..) aufrufen ?

Zitat:
Bei einem Würfel brauchst Du Dir aber um den Speicher eh keine Gedanken machen.

Das ist mir klar, aber ist ein gutes Beispiel.
Es geht mir schon um komplexere Mesh, z.B. Zylinder, Kugel, oder etwas gemischtes, so wie das Flügeli von meinem Niveau-Anzeiger-Demo..

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Di Jul 21, 2015 12:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Schau dir mal das glcmd Array vom MD2 Format an. Da siehst du wunderbar wie so etwas in der "echten" Welt benutzt wurde. Eine genaue Doku mit Code dazu findest
du hier. Ich denke aber heutzutage sollte man eher Triangles benutzen da du so weniger switchen musst und damit DrawCalls sparst.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Di Jul 21, 2015 14:17 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
mathias hat geschrieben:
Zitat:
Zeichne doch z.B. alle 6 Seiten des Würfels mit einem separaten Strip, spart immerhin ein Drittel.

Du meinst, ich sollte 6 mal glDrawArrays(..) aufrufen ?


Ja! In Bezug auf Performance wohl ein Desaster, aber eine Lösung für dein Problem ;)

mathias hat geschrieben:
Zitat:
Bei einem Würfel brauchst Du Dir aber um den Speicher eh keine Gedanken machen.

Das ist mir klar, aber ist ein gutes Beispiel.
Es geht mir schon um komplexere Mesh, z.B. Zylinder, Kugel, oder etwas gemischtes, so wie das Flügeli von meinem Niveau-Anzeiger-Demo..


Würde Dir auch dazu raten, Strips nur in für Sonderfälle zu nutzen, also nur wenn es sich anbietet oder sehr speicherintensiv ist, da es i.d.R. komplizierter ist, und Speicher ja heute nicht mehr so die Mangelware ist.

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Di Jul 21, 2015 16:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Vinz hat geschrieben:
Würde Dir auch dazu raten, Strips nur in für Sonderfälle zu nutzen, also nur wenn es sich anbietet oder sehr speicherintensiv ist, da es i.d.R. komplizierter ist, und Speicher ja heute nicht mehr so die Mangelware ist.


z.B. curves :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Di Jul 21, 2015 16:39 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Es wäre absolut unsinnig ein Mesh in mehrere Draw Calls zu unterteilen um Triangle Strips verwenden zu können.
Zum Glück ist das aber auch nicht notwendig, denn es gibt ja den Primitive Restart Index. ;-)
Und auch wenn es den nicht gäbe, bräuchte man nicht mehrere DrawCalls, sondern könnte mit degenerierten Dreiecken arbeiten. Also Dreiecke die zweimal den selben Index besitzen und somit nur noch eine Linie sind. (also nicht sichtbar)
Für mehr Infos dazu, siehe zum Beispiel hier: http://www.learnopengles.com/tag/degenerate-triangles

Im Index Buffer kann man damit asymptotisch zwei drittel des Speicherplatzes sparen. Ob es das bringt kommt auf die Anwendung an. In einigen Fällen ist es sehr einfach, ein gutes Triangle Strip zu generieren. Zum Beispiel bei einer Heightmap ist es eigentlich kaum Mehraufwand, ein Triangle Strip zu verlegen und man entlastet damit Speicher und Caches der Grafikkarte. Also ist es sogar schneller zu rendern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Mi Jul 22, 2015 17:13 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
So wie es aussieht, bleibe ich bei den normalen Triangle. Speicher sollte heute kein Problem mehr sein, die Zeiten von 8MB-Graka ist zum Glück vorbei.
Im Vergleich zu Texturen macht dies sowieso ein kleiner Teil aus.
Zweitens wird intern sowieso alles mit Dreiecken gemacht.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Do Jul 23, 2015 10:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Der Teil mit dem Speicher ist weniger interessant als der Teil mit den Caches, das hätte man hervorheben sollen. Da gibt es ja, wenn ich das aus dem Forum hier richtig in Erinnerung habe, nicht nur so Caches wie von der CPU, dass der Arbeitsspeicher gecached wird, sondern ggfs. auch Caches mit dem Ergebnis der Vertexshader.

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  
 Betreff des Beitrags: Re: TRIANGLE oder TRIANGLE_STRIP
BeitragVerfasst: Sa Jul 25, 2015 22:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ob und welche Primitivenart man benutzt ist eher eine Sache des austestens, als mit Daumenregel.
Prinzipiell verbrennt der Fragmentshader mehr und ist einfacher zu optimieren.

Man kann sagen das ein Trianglestripe schneller ist, je mehr triangle involviert sind, weil die caches besser greifen und wenn man nicht gerade HBM Speicher hat, dann sind die Speicherzugriffe das Bottleneck.

Die GPU kann einige hundert millionen triange pro Sekunde verarbeiten aber die Speicherzugriffszeit ist unterirdisch im vergleich.
Das kann man ganz einfach beweisen, in dem man eine 4k Textur mit und ohne mipmaps abwechselnd auf ein kleines quad renderst.
Das mit den Mipmaps wird mit default settings sich das passende lod Level berechnen und dann auf diese Textur texel im Speicher lesen.
Ohne Mipmaps werden die einzelnen Texel aus der 4K Textur gelesen und interpoliert und das über mehrere Schritte, bis es auf das LOD Level passt.
Erstens verbrennt im Vergleich zu 2. kaum Lesezugriffe auf dem Speicher aber rendern doch die gleichen 2 Dreiecke mit der gleichen Füllrate und doch bricht die Performance bei 2. ein.
Wichtig bei dem Test ist, dass man drauf achtet, das nicht Nearest Pixel als Min und Mag Filter gesetzt ist, weil sonnst bei beiden verfahren nur soviele Texel wie Fragmente gelesen werden.

Also ob Triangle oder Triangle-Stripe ist schon eher eine Optimierung die man sich viel Später angucken kann.
Um auf die Frage selber zu beantworten, Triangle-Stripe ist üblich und schneller.
Man zerlegt die triangle in mehrere Stripes in einen Buffer und rendert die mit einem Drawcall.
Das Zerlegen passiert anhand einer einfachen Eigenschaft von Flächen Smooth-Face und Flat-Face.
Smooth-Face kann prinzipiell komplett als ein Stripe zusammen gepammt werden ohne groß nach zu denken und bei Flat-Face sollte man die gleichen Normalen raus suchen und die Faces entsprechend zerlegen.
Dann verbindet man die resultierenden Faces über degenerierte Triangles und man wird glücklich.
Degenerierte Triangles sind triangles wo alle Kanten auf einer Linie liegen und werden vom Renderer automatisch übersprungen, weil er die eh nicht sinnvoll durch den Rasterizer jagen kann.
Die Moderne Alternative(OGL4+) wären Command Buffer mit mehreren Drawcalls, welche gleich schnell sind und man kann sich die Degenerierten Triangles sparen.

Bei kleinen Meshes mit 1-150 Triangle ist auf meiner gf980 und vor FuryX es sogar schneller keine Indices zu verwenden, weil die zusätzlichen Speicherzugriffe mehr Zeit brauchen als der Vorteil von den Indices kompensiert. Das hab ich auch schon auf älteren GPUs aus der 8xx,7xx GTX Reihe beobachtet. NV und AMD haben früher Tools dafür angeboten Turtle und Melody glaube ich waren die Namen. Neben den effizienten Stripen haben die auch die Stripes so sortiert, dass der Overdraw reduziert wird. Die Tools sind verschwunden aber es lohnt sich immer noch sowas auf die Modelle an zuwenden. Heute gibt es Komerzielle Tools die sich drum kümmern wie z.B. Simplygon oder Maya/Max Plugins.

Allerdings wird sich da wohl vieles ändern, ich hab nu meine AMD Fury X eingebaut und bisherige Game und Synthetische Benchmarks haben kaum unterschied zur Titan Performance gezeigt ausser wenn es um Speicherintensivere dinge geht wie z.B. compute oder hohe Texturauflösungen und große Renderauflösungen,da hat die neue HBM Speicherarchitektur die Titan(schnellste Karte bisher gewesen) GDDR5 Speicher um über 100% abgehängt.
Entsprechend stellen sich nun viele Techniken erneut unter die Probe ob sie mit der künftigen neuen Speicherarchitektur vieleicht veraltet sind.
NVidia hat AMDs HBM Speicherarchitektur Lizensiert und bringt ihre nächste Karte(Q1 2016) mit dieser raus und damit ist GDDR Geschichte.
HBM ähnelt HCM und ist grob gesagt ein 3Dimensionaler Raid0 Speicher, der in der untertakteten ersten Generation schon 13-15x schneller im Zugriff ist.
Entsprechend werden Techniken, die auf Speicherzugriffe angewiesen sind und dadurch weniger Fragmente(z.B. Raytracing und Voxel) brauchen viel effizienter als mit den alten Grafikkarten.

_________________
"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  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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