2017-01-15 2 views
1

Je travaille sur un projet 2D pur, où l'écran est rendu par CPU, et je veux l'afficher comme une texture, mais je ne veux pas télécharger l'image entière pour chaque image. Je ne peux pas dire quelles pièces sont modifiées, donc je suppose que l'image entière est invalide. J'ai besoin de faire un peu de post-traitement (en ajoutant un autre calque avec quelques blits), et mes premiers tests ont montré qu'il pouvait s'agir d'un problème de performances en CPU, c'est pourquoi j'ai besoin de GPU accéléré. mais n'est pas commun/portable de nos jours ...).OpenGL ES 3.0: rendre le rendu de la CPU zéro-copie à la texture?

Ma plate-forme cible est un système embarqué (ARM) où GPU et CPU partagent la mémoire, donc théoriquement je pourrais le faire sans aucune copie. La plate-forme choisie prend en charge OpenGL 2.1 et OpenGL ES 3.0.

Je comprends que les objets tampons peuvent être mappés par glMapBufferRange(). J'ai regardé les possibilités suivantes:

  • UNIFORM_BUFFER: trop petit pour stocker une image plein écran

  • SHADER_STORAGE_BUFFER: prise en charge que de ES 3.1

  • Shader Image Store de charge: prise en charge uniquement ES de 3,1

  • tampon Texture: 3,0 ES ne supporte pas (pris en charge à partir de ??)

    pixel buffer Objets: Je ne peux pas les atteindre de shaders, et il me semble qu'il ne copie lorsque je mets à jour une texture de celle-ci. Je ne sais pas s'il est plus rapide que la copie de la mémoire du client (en tenant compte du fait qu'ils résident tous sur la même puce RAM :))

  • textures simples: sont tamponner pas des objets, ne peuvent pas être mis en correspondance dans la mémoire de processus client

Quelque chose me manque? Il n'y a aucun moyen dans ES 3.0 pour partager un tampon avec le GPU contenant la quantité de données de masse ce que je peux écrire à partir du CPU et lire à partir des shaders fragmentés?

Répondre

0

Vous pouvez changer la texture partiellement GLES20.glTexSubImage2D.