2008-12-15 7 views
2

Je rends une certaine scène à un tampon d'image hors champ (FBO) et puis je lis l'image rendue en utilisant glReadPixels() pour le traitement sur la CPU. Le traitement implique des routines de numérisation très simples et l'extraction de données. Après le profilage, j'ai réalisé que la majeure partie de ce que mon application fait est de passer du temps dans glReadPixels() - plus de 50% du temps. L'étape naturelle consiste donc à déplacer le traitement vers le GPU afin que les données n'aient pas à être copiées. Donc, ma question est - quelle serait la meilleure façon de programmer une telle chose au GPU?
GLSL?
CUDA?
Autre chose dont je ne suis pas actuellement au courant?
Les exigences principales est qu'il aura accès à des tampons de trame hors écran rendus (ou des données de texture car il est possible de rendre à une texture) et d'être en mesure de fournir certaines informations au processeur, par exemple dans l'ordre de 1-2Kb par trame.Débutant à la programmation GPU: quoi apprendre?

Répondre

1

Il y a un certain nombre de pointeurs pour commencer avec la programmation GPU dans d'autres questions, mais si vous avez une application qui est déjà construit en utilisant OpenGL, puis probablement votre question est vraiment « que l'on va interopérer avec OpenGL "? Après tout, votre objectif est d'éviter le retour de votre FBO du GPU au CPU avec glReadPixels(). Si, par exemple, vous deviez le relire de toute façon, puis copier les données dans un tampon CUDA, puis le transférer vers le GPU en utilisant les API CUDA, il n'y aurait pas beaucoup de points.

Vous avez donc besoin d'un package GPGPU qui prendra directement en entrée votre objet OpenGL FBO, sans aucune copie supplémentaire.

Cela exclurait probablement tout sauf GLSL. Je ne suis pas sûr à 100% si CUDA a un moyen de fonctionner directement sur un objet tampon OpenGL, mais je ne pense pas qu'il a cette fonctionnalité. Je suis sûr que SDK Stream d'ATI ne fait pas cela. (Bien qu'il fonctionnera avec DirectX.)

Je doute que la "technologie d'aperçu" DirectX 11 avec les shaders de calcul a cette fonctionnalité, soit. Suivi: il semblerait que CUDA, au moins la version la plus récente, prenne en charge l'interopérabilité OpenGL. Si c'est le cas, c'est probablement votre meilleur pari.

Questions connexes