2008-10-18 8 views
5

J'ai besoin de rendre beaucoup d'images (dizaines de milliers) en dehors de l'écran en utilisant OpenGL.
Je cours sous Windows et utilise QT comme framework. la solution ne peut être que des fenêtres, cela n'a pas vraiment d'importance.OpenGL: Rendu rapide hors-écran

D'après ce que j'ai trouvé avec Google il y a un certain nombre d'options pour ce faire This article qui semble plutôt daté suggérer quelques moyens, dont ceux qui sont pertinents sont:

  • Windows spécifique - Utilisation CreateDIBSection et en quelque sorte lier la texture à celui-ci.
  • Utilisez l'extension pbuffers qui semble être supportée sur ma carte.

This thread (message 6) suggère une manière spécifique de l'intervalle QT de le faire en utilisant QGLWidget::renderPixmap

Ma question est - ce qui serait le moyen le plus rapide? pbuffers semble être le pari le plus sûr car il est garanti d'être effectué sur le matériel, mais n'utilise pas la méthode CreateDIB passe également par le matériel? Qu'en est-il de la méthode QT? il semble y avoir un problème de création de contexte avec celui-ci. Je ne voudrais sûrement pas créer un nouveau contexte pour chaque image que je crée.
Est-ce que quelqu'un a une bonne expérience avec cela?


EDIT: Répondre au commentaire -
J'ai une scène constante qui ne change pas du tout et je le rendre de nombreux points de vue différents. Pour l'instant les images retournent à l'utilisateur et seront traitées par le CPU. Peut-être dans le futur ils vont être traités sur le GPU.

+0

D'où proviennent les images? Est-ce que vous reproduisez la même scène encore et encore, peut-être à partir de différents points de vue? Ou chargez-vous la texture après la texture du disque? Et où vont les images? Dans un calcul gpu? Sur le disque? Votre réponse dépend des détails. – ejgottl

+0

ANSWERED la question – shoosh

+0

Peut-être que ce lien peut être utile, ici je objets framebuffer avec 'QGLFrameBuffer' http://stackoverflow.com/questions/19934102/qglwidget-and-fast-offscreen-rendering/ – linello

Répondre

9

Utilisez FBO. C'est rapide, portable et beaucoup plus agréable à utiliser que les tampons.

EDIT: Pour des performances optimales, le rendu alternent entre deux organisations confessionnelles différentes:

  1. rendu à A
  2. rendu à B
  3. relues de A et le traiter
  4. Render à A
  5. Relecture de B
  6. Aller à 2

De cette façon, vous pouvez relire un FBO puis le traiter pendant que le GPU se rend à l'autre en parallèle.

+0

Oui je Je viens de lire à propos de FBO. alterner entre deux sons comme une bonne idée. Savez-vous s'il existe une différence entre le rendu d'une texture et le rendu d'un RenderBuffer? lequel est plus vite? – shoosh

+0

Le rendu vers un rendu est préférable; si peut être plus rapide et ne sera certainement pas plus lent. –

+0

bon lien PBO http://www.songho.ca/opengl/gl_pbo.html –