Effizientes OpenGL
-
Hallo,
ich entwickle zur Zeit eine OpenGL-Anwedung unter der MFC.
Soweit komme ich (dank dem Forum) ganz gut klar.
Aber ich möchte das ganze nun auch beschleunigt, wenn's geht:Ich stelle eine Struktur (z.B. Brücke, Gitter etc) unter mechanischer Belastung dar, indem ich mir aus jeweils 4 GL_QUADS eine "Röhre" zusammenbaue. Aus ein paar tausend Röhren setze ich dann die Struktur zusammen.
Wie komme ich auf Röhren? Nun, ich habe aus der Berechnung "Stützstellen", die mir die Verformung angeben. Ich verbinde einfach zwei benachbarte Stützstellen des verformten Bauteils, und habe ein verformtes Element. Unter Verwendung vieler Stützstellen ergibt sich ein halbwegs detailreiches Bild.
Ich habe die Stützstellen als Transformationsmatrix, kenne also Position und Orientierung. Ich springe von einer Stützstelle zur nächsten, setze um jede Stützstelle ein Querschnitts-Rechteck, drehe es mit der Transformationsmatrix und verbinde die gegenüberliegenden Eckpunkte benachbarter Rechtecke zu jeweils einer kleinen Röhre.
Aber... geht das nicht schöner? Ich rechne halt die Eckpunkte per Hand aus, indem ich die Vektoren zu den Eckpunkten mit der Matrix multipliziere - das müßte die GL-Pipeline doch viel schneller können. Ich weiß nur nicht so recht, wie.
Die Pipeline bekommt bei mir nur noch die fertigen Vertexes als GL_QUADS - das kann's nicht sein
So, nun bitte ich um Vorschläge
. Klingt sicherlich etwas abstrakt. Wenn ich nicht präsize genug beschrieben habe, sagt mir Bescheid - ich versuche mich dann zu präzisieren...
Danke,
tronaccount
-
tronaccount schrieb:
Die Pipeline bekommt bei mir nur noch die fertigen Vertexes als GL_QUADS - das kann's nicht sein
dann wirst du wohl einen vertexshader mit glsl oder ein vertex program schreiben müssen, dem du möglichst viele der matrizen reinstopfen kannst, jedem vertex einen index mitgeben, welche matrix ihn beeinflussen soll und im wesentlich das gleiche machen, was du unter vertex skinning im netz weit besser und verständlicher erklärt bekommst.
-
Okay. Brauche nur ein paar Schlagwörter für die Recherche.
"Vertex Skinning" heißt das? Sonst noch Vorschläge für Programmiertechniken?
Danke schonmal.
-
such mal nach display lists und vertex arrays.
ansonsten sind triangles schneller als quads..
-
Also, mit Display Lists wird's wohl nicht klappen. Dazu müßten die Elemente doch alle dieselbe Gestalt haben, oder?
Bei mir sind die Röhren aber alle unterschiedlicher Gestat, d.h. Querschnitte ändern sich (okay, das ließe sich mit glScale noch regeln), aber auch Verwindungen, d.h. unterschiedliche Rotationen der Querschnittsrechtecke zwischen zwei Stützstellen sind möglich.
Werde mich dann mit Vertex Arrays beschäftigen...
Weitere Vorschläge?
-
Irgendwie glaub ich nicht, das man 'ne ganze Physikengine in einen Vertexshader packen kann. Wird wohl die CPU machen müssen.
Bye, TGGC (Für echte Fans)
-
TGGC schrieb:
Irgendwie glaub ich nicht, das man 'ne ganze Physikengine in einen Vertexshader packen kann. Wird wohl die CPU machen müssen.
es war nie die rede, daß er die physik in einem shader machen soll. aber wenn man einen stapel matrizen hat und einen stapel punkte, die damit transformiert werden sollen, dann ist das 08/15 skinning und das läßt sich ohne jeden streß im shader machen, statt damit cpu-zeit zu verschwenden. in der praxis wird der unterschied trotzdem nicht groß sein, sofern das programm sonst eh nicht viel macht. außer vielleicht er hat einen 300mhz rechner und eine geforce 8 superultradoll-oc-edition *g*
-
Hallo,
danke für die Tips.
Also, die Physik ist schon erledigt. Es geht mir nur darum, die Transformation (Matrix * Vextor) nicht auf der CPU, sondern elegant in der hardware-beschleunigten OpenGL-Pipeline zu rechner.
Shader also...? Werde mir das ebenfalls mal anschauen.
Danke!
-
Trienco schrieb:
TGGC schrieb:
Irgendwie glaub ich nicht, das man 'ne ganze Physikengine in einen Vertexshader packen kann. Wird wohl die CPU machen müssen.
es war nie die rede, daß er die physik in einem shader machen soll. aber wenn man einen stapel matrizen hat und einen stapel punkte, die damit transformiert werden sollen, dann ist das 08/15 skinning und das läßt sich ohne jeden streß im shader machen, statt damit cpu-zeit zu verschwenden. in der praxis wird der unterschied trotzdem nicht groß sein, sofern das programm sonst eh nicht viel macht. außer vielleicht er hat einen 300mhz rechner und eine geforce 8 superultradoll-oc-edition *g*
Glaube trotzdem nicht, das man 'ne ganze Physikengine in einen Vertexshader packen kann.
Bye, TGGC (Dem beste BdT)
-
TGGC schrieb:
Irgendwie glaub ich nicht, das man 'ne ganze Physikengine in einen Vertexshader packen kann. Wird wohl die CPU machen müssen.
Bye, TGGC (Für echte Fans)
hat nvidia gemacht.
rapso->greets();