2016-11-15 2 views
0

manipuliert Dies mag wie eine grundlegende Frage erscheinen, aber wie können Sie mit Objekten arbeiten/manipulieren, die mit Hilfe von Shadern in OpenGL erstellt wurden?OpenGL-Objekt, das von Shader

Ich bin immer in der Notwendigkeit der Koordinaten verschiedener Objekte, in meinem Host-Programm zu verwenden, um verschiedene Objekte basierend auf diesen Koordinaten zu erstellen/manipulieren und sie dann an den Vertex-/Fragment-/Geometrie-Shader zurückzusenden.

Ich habe meine ersten Scheitelpunktkoordinaten, dass ich in meinem Hauptprogramm definiert habe, aber sobald sie den Geometrie-Shader zu erreichen, wird die Position berechnet über:

gl_Position = projection_matrix * view_matrix * vec4(square_point,1); 
EmitVertex(); 

Und jetzt zum Beispiel muß ich Wähle sie aus und bewege sie mit der Maus auf dem Bildschirm. Aber es gibt keine einfache Möglichkeit, an die genauen Koordinaten zu kommen. Ich habe versucht, die Position Mathe in meinem Hauptprogramm zu tun, aber ich bekomme nicht die gleichen Koordinaten wie die vom Geometrieshader berechneten. Und alles auf der CPU zu berechnen, ist nicht wirklich optimal für die Anzahl der Objekte, die ich habe.

Ich habe daran gedacht, einige GPU-> CPU-Daten abrufen, über Puffer, aber es gibt so viele Objekte und so viele Koordinaten, dass es unerbittlich ist.

Ich stelle mir vor, dass es einen anderen Weg gibt, sich dem zu nähern, nur dass ich nicht das richtige Wissen darüber habe, wie OpenGL funktioniert.

+0

Behandeln Sie die 'w' Koordinate nach der Transformation korrekt? Das ist ein Schritt (der alle 4 Vektorkomponenten teilt), der nach dem Ausführen des Geometry Shaders passiert. Wenn Sie die emittierten Scheitelpunkte erfassen und diese vergleichen, wurde dieser Schritt noch nicht ausgeführt. –

+0

@ AndonM.Coleman - Ich denke nicht. Ich wende die genaue Formel an, die ich in die Frage gestellt habe. –

Antwort

0

Sie können sogenannte Shader-Speicherpufferobjekte SSBO verwenden. Sie erstellen sie in Ihrem Shader mit dem Qualifier buffer. Dann machen Sie die notwendigen Berechnungen und laden Sie Ihre Daten über glMapBufferRange und memcpy.