4 Stimmen

glReadPixels() langsam beim Lesen von GL_DEPTH_COMPONENT

Meine Anwendung ist darauf angewiesen, Tiefeninformationen aus dem Framebuffer zurückzulesen. Ich habe dies mit glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_data) implementiert

Allerdings läuft dies unangemessen langsam, es bringt meine Anwendung von einer glatten 30fps zu einer laggy 3fps. Wenn ich versuche, andere Dimensionen oder Daten zurückzulesen, läuft es auf einem akzeptablen Niveau.

Um einen Überblick zu geben:

  • Kein glReadPixels -> 30 Bilder pro Sekunde
  • glReadPixels(0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_data); -> 20 Bilder pro Sekunde, akzeptabel
  • glReadPixels(0, 0, width, height, GL_RED, GL_FLOAT, &depth_data); -> 20 Bilder pro Sekunde, akzeptabel
  • glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, &depth_data); -> 3 Bilder pro Sekunde, nicht akzeptabel

Warum sollte der letzte Anruf im Vergleich zu den anderen so langsam sein? Gibt es eine Möglichkeit, dies zu ändern?

Breite x Höhe etwa 100 x 1000 beträgt, wird der Aufruf immer langsamer, je größer die Abmessungen sind.

Ich habe auch versucht, Pixelpuffer-Objekte zu verwenden, aber das hat keine signifikante Auswirkung auf die Leistung, es verzögert nur die Langsamkeit bis zum glMapBuffer() Aufruf.

(Ich habe dies auf einem Macbook Air nVidia 320m Grafik OS X 10.6 getestet, seltsamerweise bekam mein altes MacBook Intel GMA x3100 ~15 fps beim Lesen des Tiefenpuffers).

UPDATE: Das Weglassen von GLUT_MULTISAMPLE aus den glutInitDisplayMode-Optionen machte einen großen Unterschied und brachte die Anwendung wieder auf flüssige 20fps. Ich weiß nicht, was die Option in erster Linie tut, kann jemand erklären?

3voto

kvark Punkte 5171

Wenn Ihr Haupt-Framebuffer MSAA-aktiviert ist (GLUT_MULTISAMPLE ist vorhanden), dann werden 2 tatsächliche Framebuffer erstellt - einer mit MSAA und einer normal.

Die erste wird von Ihnen ausgefüllt. Sie enthält vordere und hintere Farbflächen sowie Tiefe und Schablone. Die zweite muss nur die Farbe enthalten, die durch die Auflösung der entsprechenden MSAA-Fläche erzeugt wird.

Wenn Sie jedoch versuchen, die Tiefe zu lesen, indem Sie glReadPixels der Treiber ist gezwungen, auch die MSAA-aktivierte Tiefenfläche aufzulösen, was wahrscheinlich die Ursache für die Verlangsamung ist.

1voto

Bahbar Punkte 17300

Welches Speicherformat haben Sie für Ihren Tiefenpuffer gewählt?

Wenn es nicht GLfloat ist, dann bitten Sie GL, jede einzelne Tiefe im Tiefenpuffer beim Lesen in Float umzuwandeln. (Und es ist das gleiche für Ihre 3. Aufzählung, mit GL_RED. war Ihre Farbe Puffer ein Float-Puffer?)

0voto

bluezones Punkte 1

Egal ob es GL_FLOAT oder GL_UNSIGNED_BYTE ist, glReadPixels ist immer noch sehr langsam. Wenn Sie PBO verwenden, um RGB-Werte zu erhalten, wird es sehr schnell sein. Wenn Sie PBO verwenden, um RGB-Werte zu verarbeiten, beträgt die CPU-Auslastung 4 %. Bei der Verarbeitung von Tiefenwerten steigt sie jedoch auf 50%. Ich habe GL_FLOAT, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, GL_UNSIGNED_INT_24_8 ausprobiert. So kann ich schließen, dass PBO ist nutzlos für das Lesen Tiefe Wert

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