2010-03-05 4 views
2
glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const ovid *pixels); 

Y at-il une fonction comme celle-ci, sauf qu'au lieu d'accéder à la mémoire CPU, il accède à la mémoire GPU? [Soit une texture d'un objet de mémoire tampon de trame]Equiv de glDrawpixels qui fonctionne sur la mémoire GPU?

+0

Définir une texture et dessiner un rect? – falstro

Répondre

1

Si elle se trouve dans une texture:

  • mis en place tronconique orthographiques
  • mélange désactiver, test de profondeur, etc.
  • texture de liaison
  • dessiner un quad texturé aligné sur l'écran avec des coordonnées de texture correctes

Je l'utilise par exemple dans Compositor::_drawPixels

0

glDrawPixels peut lire à partir d'un objet tampon. Il suffit de faire un

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, XXX) 

avant d'appeler glDrawPixels.

Avertissement: glDrawPixels est obsolète ...

+0

@Bahbar Quelle est la solution non-obsolète? – anon

0

utilisation glBlitFramebuffer, qui opère sur les objets frambuffer (Link). Ans ce n'est pas déconseillé.

Vous pouvez profiter de conversion de format, mise à l'échelle et multiéchantillonnage.

4

Couvrons toutes les bases ici. D'abord, une réponse directe: oui, il existe une telle fonction. C'est ce qu'on appelle glDrawPixels. Je ne plaisante pas.

glDrawPixels peut certainement lire à partir de la mémoire GPU, à condition que you are using buffer objects as their source data (communément appelé "objets tampon pixel"). glDrawPixels peut utiliser des objets de tampon de pixel comme source pour les données de pixel. Les objets tampons sont (théoriquement au moins) dans la mémoire du GPU, donc ils sont qualifiés.

Cependant, vous ajoutez sur cette "Soit une texture d'un objet tampon d'image". Sous cette qualification, vous demandez, "existe-t-il un moyen de copier des données de pixel d'un texture/framebuffer vers le framebuffer actuel?"

Oui. glBlitFramebuffer peut le faire. Il passe du GL_READ_FRAMEBUFFER au GL_DRAW_FRAMEBUFFER. Et puisque vous pouvez ajouter des images à partir de textures aux FBO, vous pouvez copier des images très bien. Vous pouvez même copier à partir du framebuffer par défaut vers un rendu ou une texture.

Vous pouvez également utiliser glCopyImageSubData, qui copie des rectangles de pixels d'une image à l'autre. C'est beaucoup plus pratique que glBlitFramebuffer si tout ce que vous faites est de copier des données de pixels. C'est assez nouveau à l'heure actuelle (GL 4.3 ou ARB_copy_image). Il ne peut pas être utilisé pour copier des données dans le framebuffer par défaut.

Questions connexes