7 Stimmen

Beste Möglichkeit, auf Pixel in OpenGL zuzugreifen?

Ich bin so ziemlich ein Neuling mit OpenGL. Ich stelle mir vor, dass glReadPixels schrecklich ist, also was ist der beste Weg, das zu tun? Ich dachte daran, eine Funktion zu haben, die ein Textur-Rechteck sperrt, etwas wie glTexSubImage2D tut, um die Pixel in den RAM zu kopieren, sie zu ändern und dann glTexSubImage2D zu verwenden, um den RAM zurück in die Textur zu kopieren. Ist das ein guter Weg? Ich kann Optimierungen wie ein Flag denken, das besagt, dass die Textur nicht kopiert werden soll, da Sie sie sowieso alle überschreiben und zwischenspeichern werden.

Welche anderen Methoden kann ich verwenden? Kann mir jemand die Namen der gl-Funktionen nennen, die ich vielleicht verwenden möchte (damit ich das Handbuch lesen kann) oder mich an ein Tutorial weiterleiten? Ich habe versucht zu googeln, aber die meisten Ergebnisse sehen nicht so aus, als würden sie das tun, was ich im Sinn hatte.

6voto

Nils Pipenbrinck Punkte 80152

GlReadPixels ist der Weg zu gehen.

Ja, es ist langsam - schrecklich langsam. Aber so ist es nun einmal. Die DirectX-Pendants (z.B. Sperren und Lesen der Pixel) sind auch nicht viel schneller.

Im Allgemeinen sollten Sie das Zurücklesen von Pixeln und die Verarbeitung mit der CPU vermeiden. Sie können eine Menge Verarbeitung mit Pixel-Shadern durchführen, aber das hilft Ihnen nicht, wenn Sie Screenshots machen möchten (wo die Daten letztendlich in der CPU landen müssen).

6voto

user473816 Punkte 326

Wie bereits erwähnt, ist glReadPixels der richtige Weg. Eine Möglichkeit, das Lesen des Framebuffers oder den Zugriff auf Pixel zu beschleunigen, besteht darin, die ARB_pixel_buffer_object-Erweiterung zu verwenden. Dadurch können Sie glReadPixels asynchron ausführen und die Leistung kann deutlich schneller sein, wenn Sie eine große Anzahl von Pixeln lesen müssen. Die Leistung kann deutlich schneller sein, weil der Transfer mit DMA durchgeführt wird, wenn Sie das "richtige" Format verwenden, und keine wertvollen CPU-Zyklen verbraucht werden.

0voto

geofftnz Punkte 9606

Die beste Idee wäre, den Frame-Buffer-Speicher auf der Grafikkarte als schreibgeschützt zu behandeln. Ich glaube, der Grund dafür ist, dass der Videospeicher für das Schreiben von der CPU-Seite optimiert ist, auf Kosten des Lesens. (Natürlich kann der Videospeicher schnell von der Seite der Grafikkarte aus gelesen werden - er muss ihn in Echtzeit an den Monitor senden)

Die schnellste Lösung hängt davon ab, was Sie zu tun versuchen (könnten Sie näher erläutern?).

Es hindert Sie nichts daran, Ihren eigenen Framebuffer im Hauptspeicher zu behalten, diesen dann jedes Frame in eine Textur zu kopieren und in OpenGL zu rendern. Ich habe das schon einmal gemacht und es ist viel schneller als glReadPixels, allerdings verlieren Sie die Möglichkeit, die Ergebnisse anderer OpenGL-Rendering-Aktivitäten zurückzulesen. Verwenden Sie das, wenn Sie nur den frame-by-frame Zustand eines Teils Ihrer Szene behalten müssen, z.B.: Generieren einer dynamischen Textur, die nicht über einen Pixel-Shader gemacht werden kann.

Sie könnten auch damit davonkommen, eine viel kleinere Datenmenge zurückzulesen. Das habe ich gemacht, als ich mit unrealistischem Rendern herumspielte. Ich habe meine Szene genommen, sie mit 160x120 gerendert, das in den Hauptspeicher zurückgelesen und sie dann als eine Sammlung von 2D-Sprites neu gerendert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X