2017-07-30 7 views
-1

Also versuche ich ein bestimmtes Pixel eines Sprites zu ändern. Derzeit habe ich es geschafft, indem ich mir selbst eine SetPixel(int x, int y, Color color) Funktion erstellt habe. Es funktioniert, indem Texturinformationen (RGBA-Werte) geändert und dann an ein Sprite übergeben werden. Aber das ist langsam:OpenGL SetPixel mit einem Fragment Shader

1) Mit CPU anstelle von GPU wo (ich hoffe) Ich könnte Shader verwenden, um meine Leistung zu verbessern.

2) Ich muss die geänderte Textur jedes Mal neu hochladen, wenn ich ein einzelnes Pixel modifiziere.

Diese Frage ist groß für mich. Wie verwende ich Shader, um ein bestimmtes Pixel zu modifizieren? Ich kann nur die Farbe pro Vertex ändern, was ich nicht möchte.

Irgendwelche Vorschläge?

+1

Fragment Shader ändert alle Pixel in einem Framebuffer (wenn Sie drawElements oder drawArrays aufrufen), nicht nur ein einzelnes Pixel. Wenn sich der neue Farbwert in Ihrem CPU-Programm befindet, können Sie ihn entweder in die GPU-Textur hochladen oder als konstante Variable in Ihrem Fragment-Shader festlegen. –

+1

Sind Sie sicher, dass Sie nicht mehrere Pixel gleichzeitig ändern möchten? Das Hochladen von 1 Pixel auf die GPU ist ebenso komplex wie das Hochladen von 1000000 Pixeln. –

+1

Vorschlag: Löschen Sie Ihre 'SetPixel'-Funktion und finden Sie heraus, wie Sie ohne das tun können, was Sie tun. – ybungalobill

Antwort

0

Zunächst müssen Sie nicht alle Textur hochladen und nach jedem Pixelupdate. Sie können Änderungen zwischenspeichern und das kleinste Rechteck mit glCopyTextSubImage aktualisieren.

Wenn Sie GPU-Updates wirklich ausprobieren möchten, können Sie Compute Shader verwenden (einige alte Hardware unterstützt sie nicht) oder binden Sie Ihre Texturdaten als SSBO und schreiben Sie direkt ohne separates Framebuffer-Objekt.