2016-12-05 1 views
0

Ich möchte Informationen in einer Textur speichern und aktualisieren. Die Idee ist also, dass ich eine neue Textur mit aktuellen Informationen erstelle. Während ich es im Renderprozess abspeichere, möchte ich eigentlich die Informationen aus demselben Pixel lesen und einen gewichteten Durchschnitt beider Werte speichern. Also der Wert, der zu diesem Pixel gerendert wurde und der Wert, der bereits auf diesem Pixel war.Lesen und Schreiben in einer Textur (OpenGL)

Jetzt lese ich sehr oft, dass ich nicht auf der gleichen Textur lesen und schreiben kann. Jetzt ist meine Frage, vielleicht ist es möglich? und wenn nicht, sollte ich die Texturinformationen vor dem Renderschritt kopieren und die Kopie an den Shader übergeben? Wenn ja, wie kann ich die Textur kopieren? oder sollte ich einen zusätzlichen Rendering-Schritt zum Kopieren machen?

Antwort

2

Ich sehe zwei mögliche Optionen hier, je nach Mischung Gleichung

  • Alpha Blending: Wenn die Gleichung verwendet, um eine der glBlendFunc Funktionen zugeordnet werden kann, dann ist dies der Weg zu gehen. Wenn Sie lineare Faktoren für den gespeicherten und den neuen Wert verwenden möchten, sollte dies möglich sein. Dies ist auch die Option, bei der ich die beste Leistung erwarte.

  • Bild Laden Laden: Mit dieser Methode kann man gleichzeitig in die gleiche Textur lesen und schreiben (see here). Die Leistung ist in der Regel sehr schlecht und Sie müssen die atomaren Operationen verwenden, um sicherzustellen, dass mehrere Fragmente am selben Ort immer den korrekten Wert lesen.

die Textur kopieren würde, meiner Meinung nach, nur, wenn Sie ein Bild machen und dann auf sie danach eine gewichtete durchschnittliche Berechnung durchführen (sonst würden Sie die Textur nach jedem Speichervorgang kopieren müssen). Aber wenn dies der Fall ist, könnte man das Ergebnis der Durchschnittsberechnung einfach in eine andere Textur rendern und alle Probleme beim Kopieren der Eingabedaten vollständig vermeiden.

0

Wenn Sie auf eine Erweiterung zurückgreifen, können Sie NV_texture_barrier verwenden, was das Schreiben und Lesen derselben Textur ermöglicht.

+0

Oder Sie könnten den Kern [Textur Barrierefunktion, die seit über einem Jahr jetzt ist] (https://www.opengl.org/wiki/Memory_Model#Texture_barrier) verwenden. –