2008-10-18 1 views
5

Ich muss ziemlich viele (Zehntausende) Bilder mit OpenGL außerhalb des Bildschirms rendern.
Ich bin unter Windows und mit QT als Framework ausgeführt. Die Lösung kann nur Windows sein, es spielt keine Rolle.OpenGL: Schnelle Off-Screen-Rendering

Von dem, was ich gefunden habe, die Verwendung von Google gibt es diese This article eine Reihe von Optionen zu tun, die eher vorschlagen, ein paar Möglichkeiten, datiert scheint, aus denen die relevanten sind:

  • Windows spezifisch - Einsatz CreateDIBSection und irgendwie die Textur daran binden.
  • Verwenden Sie die Erweiterung pbuffers, die auf meiner Karte unterstützt wird.

This thread (Nachricht 6) deutet auf eine QT spezifische Art und Weise, dies zu tun QGLWidget::renderPixmap

Meine Frage besteht darin, - welche wäre der schnellste Weg sein? pbuffers scheint die sicherste Wette zu sein, da es garantiert auf der Hardware ausgeführt wird, aber nicht die CreateDIB-Methode verwendet, geht auch durch die Hardware? Was ist mit der QT-Methode? Es scheint ein Problem mit der Kontexterstellung zu geben. sicherlich möchte ich nicht für jedes Bild, das ich erschaffe, einen neuen Kontext schaffen.
Hat jemand eine gute Erfahrung damit?


EDIT: Die Beantwortung des Kommentars -
Ich habe eine konstante Szene, die es von vielen verschiedenen Gesichtspunkten gar nicht ändern und ich bin Rendering. Momentan gehen die Bilder zurück zum Benutzer und werden von der CPU verarbeitet. Möglicherweise werden sie in Zukunft auf der GPU verarbeitet werden.

+0

Woher kommen die Bilder? Rendern Sie die gleiche Szene immer und immer wieder, vielleicht von verschiedenen Standpunkten aus? Oder laden Sie Textur nach Textur von der Festplatte? Und wohin gehen die Bilder? In eine GPU Berechnung? Auf die Festplatte? Ihre Antwort hängt von den Details ab. – ejgottl

+0

in die Frage beantwortet – shoosh

+0

Vielleicht kann diese Verbindung nützlich sein, hier habe ich Framebuffer Objekte mit 'QGLFrameBuffer' http://stackoverflow.com/questions/19934102/qglwidget-and-fast-offscreen-rendering/ – linello

Antwort

9

Verwenden Sie FBO. Es ist schnell, tragbar und viel netter als pbuffer.

EDIT: Für eine optimale Leistung alternative Rendering zwischen zwei verschiedenen FBOs:

  1. bis A
  2. render zurück von einem
  3. Lesen B und verarbeiten
  4. bis A
  5. Render
  6. Rücklesen von B
  7. Gehe zu 2

Auf diese Weise können Sie einen FBO zurücklesen und ihn dann verarbeiten, während die GPU parallel zum anderen rendert.

+0

Ja ich habe gerade über FBO gelesen. Wechsel zwischen zwei klingt wie eine gute Idee. Weißt du, ob es einen Unterschied zwischen Rendering zu einer Textur und Rendering zu einem RenderBuffer gibt? Welche ist schneller? – shoosh

+0

Rendern zu einem renderbuffer ist vorzuziehen; wenn es schneller sein kann und sicherlich nicht langsamer sein wird. –

+0

gute PBO Link http://www.songho.ca/opengl/gl_pbo.html –