Per-Vertex-Berechnung in OpenGL-Tesselation


9

Ich versuche, eine positionsbasierte Stoffsimulation mithilfe von Hardware-Tesselation zu implementieren. Dies bedeutet, dass ich einfach ein Kontrollquad auf die Grafikkarte hochladen und dann Tesselation und Geometrieschattierung verwenden möchte, um die Knoten im Stoff zu erstellen.

Diese Idee folgt dem Papier:

Huynh, David, "Stoffsimulation mit Hardware-Tessellation" (2011). These. Rochester Institute of Technology http://scholarworks.rit.edu/theses/265/

Ich weiß, wie man Tesselation verwendet, um die simulierten Punkte zu erstellen. Was ich nicht weiß, ist, wie man die berechneten Informationen in einem Framebuffer speichert.

Die Geometrie- und auch die Tesselationsbewertungs-Shader enthalten Informationen, die für die Per-Vertex-Berechnungen benötigt werden. Aber können sie direkt in den Framebuffer schreiben?

Der Fragment-Shader, den ich kenne, kann in den Framebuffer schreiben, aber meine Informationen würden interpoliert und ich würde nicht mehr wissen, was ich an welcher Position schreiben soll.


Rückkopplungspuffer transformieren
Ratschenfreak

Klingt sehr gut. Die Einschränkungen der Stoffsimulation machen es erforderlich, dass ich auf alle Nachbarn eines Partikels zugreifen kann (um die Federkräfte zu berechnen). Kann dies mit solchen Puffern gemacht werden? In einem Geometrie-Shader vielleicht? Um zu verhindern, dass der Rückkopplungspuffer jeden Scheitelpunkt mehrmals druckt, möchte ich GL_POINTS verwenden. Nach einem ersten Blick scheint dies die Berechnung der Federn zu erschweren.
Dragonseel

Antworten:


3

Basierend auf dem Kommentar von "Ratschenfreak" habe ich Transform Feedback Buffers recherchiert und mein Problem auf diese Weise gelöst.

Ich generiere jetzt die simulierten Punkte auf der CPU und füge sie in ein VertexBufferObject ein. Ich generiere einen zweiten VBO für die Punkte (zusammen mit einigen anderen für die Geschwindigkeit). Die Konnektivität des Stoffes wird in ivec4 als Vertex-Attribut angegeben.

Mit den Transformations-Feedback-Puffern und einem Doppelpuffer-Trick mit den beiden VBOs kann ich immer vom letzten Schritt lesen (unter Verwendung der Konnektivitätsinformationen) und in einen anderen Puffer schreiben. Dies dient dazu, Probleme mit der Parallelität zu lösen.

Die Berechnungen werden im Vertex-Shader als GL_POINTS durchgeführt. Durch Binden der Ausgabe des ersten Shaders an einen anderen regulären Shader unter Verwendung eines zusätzlichen Indexpuffers zum Erzeugen von Dreiecken kann ich das Tuch problemlos nach Belieben rendern.

Diese Idee folgt dem Beispiel des Transformations-Feedback-Puffers aus dem Buch "OpenGL Superbible" http://www.openglsuperbible.com/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.