2009-04-22 6 views
6

Actuellement, je charge une image en mémoire sur un deuxième thread, puis pendant la boucle d'affichage (si une charge de texture est requise), chargez la texture.Quel est un bon moyen de charger des textures de manière dynamique dans OpenGL?

J'ai découvert que je ne pouvais pas charger la texture sur le 2ème thread parce que OpenGL n'a pas aimé cela; peut-être que c'est possible mais j'ai fait quelque chose de mal - alors s'il vous plaît corrigez-moi si c'est réellement possible. D'autre part, si mon échec était valide, comment charger une texture sans perturber la boucle de rendu? Actuellement, les textures prennent environ 1 seconde à charger de la mémoire, et bien que ce ne soit pas un problème majeur, il peut être légèrement irritant pour l'utilisateur.

+0

Cela semble exceptionnellement long pour charger une texture dans la VRAM à partir de la mémoire système. Quelle est sa taille et avez-vous OpenGL générer des niveaux de mipmap pour vous? –

+0

Très grand, ce sont des images médicales. –

Répondre

4

Vous pouvez charger une texture du disque à la mémoire sur n'importe quel fil que vous aimez, en utilisant n'importe quel outil que vous souhaitez pour lire les fichiers. Cependant, lorsque vous le liez à OpenGL, il doit être géré sur le même thread que le rendu pour ce contexte OpenGL. Cela étant dit, this discussion suggère que l'utilisation d'un PBO dans un deuxième thread est une option, et peut accélérer le processus.

+0

Premier paragraphe pas si utile, sorte de répéter ce que j'ai dit hehe;) mais le 2ème paragraphe semble très utile, merci pour le lien! Je vais certainement le vérifier :) –

+0

Juste dire que ce que vous faisiez là est valide - je n'étais pas sûr de la façon dont vous l'avez écrit si c'était le cas. Bonne chance! –

+0

Compris. Merci! :) –

1

Vous pouvez certainement charger la texture du disque dans la RAM dans n'importe quel nombre de threads que vous aimez, mais OpenGL ne téléchargera pas en VRAM dans plusieurs threads pour la raison mentionnée dans la réponse de Reed.

Étant donné que le chargement à partir du disque est la partie la plus lente, c'est le bit que vous voudrez probablement enfiler. Les threads de chargement construisent une file de textures à télécharger, puis cette file est consommée par le thread qui possède le contexte GL (attention à votre accès à cette file d'attente par les différents threads cependant). Vous pouvez également envisager une approche non-threaded de télécharger N textures par image, où N est un nombre qui ne ralentit pas trop le rendu.

+0

@Justin, merci d'avoir pris le temps de répondre. Peut-être que ma question est mal formulée; Actuellement, le chargement intensif est effectué dans le 2ème thread (cela prend environ 10 secondes à charger car il y a un traitement d'image), puis il suffit d'un court instant pour copier les pixels dans la VRAM pendant la boucle GLUT; Cependant, bien que cela soit bref, cela prend un temps "inconfortable" en termes d'expérience utilisateur. –

+0

Okey, cela a du sens - postez une réponse ici quand vous comprendrez ce qui fonctionne pour vous! – Justicle

Questions connexes