Bonsoir,
D'après ce que vous décrivez :
Si vous voulez que votre application crée un film, il faudra forcément extraire les données du GPU vers le CPU. Donc il faudrait cumuler :
Citation:
* Enregistrer directement mon buffer dans une image
Citation:
* Utiliser une librairie d'imagerie pour faire un film
En effet, récupérer un PBO est normalement ce qu'il a de plus rapide pour une copie d'image de GPU à CPU (je parle biensûr en termes d'accessibilité). Jettez un coup d'oeil du côté de la présentation de Song Ho Ahn : ici. Vous devrez vous penchez sur glMapBuffer et GL_PIXEL_PACK_BUFFER. Prêtez une attention particulière au "ping pong" des buffers si possible, cela devrait alléger le processus (cf "Asynchronous Read-back").
Les autres méthodes seront plus lentes, car elles reprendront le chemin ci-dessus:
Citation:
* Transformer le PBO en une texture et enregistrer cette texture en image
Citation:
* Transformer le PBO en FBO puis l'enregistrer
Cependant, le fait que vous utilisiez CUDA et que vous recherchiez des performances tendrait plutôt à utiliser les données générées et gérés uniquement par CUDA. En effet, CUDA peut utiliser le fait que le bus PCIe est bi-directionnel; malheureusement, OpenGL aura beaucoup plus de difficulté sur ce point (plafond à environ 2.8Go/s pour CUDA sur une GTX 260 contre environ 600Mo/s pour OpenGL).
Je vous conseillerai d'effectuer tout le traitement et le rapatriement des données par CUDA en laissant une copie possible vers un PBO.
Cela donnerait par exemple,
- Data (CPU) => Data1 (GPU) (CUDA)
- Kernel sur Data1 (GPU) => Data2(GPU) [et DataPBO (optionnel, pour affichage)] (CUDA)
- Data2 (GPU) => Data' (CPU) (CUDA)
- [Affichage de DataPBO, optionnel] (OpenGL)
Cordialement