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?