Question

J'ai eu ce problème plusieurs fois. Supposons que je veuille afficher un écran de démarrage ou quelque chose dans un contexte OpenGL (ou DirectX d'ailleurs, c'est plus une chose conceptuelle), maintenant, je pourrais simplement charger une texture de 2 048 x 2 048 et espérer que la carte graphique pourra y faire face. je le suppose (mais la plupart le feront de nos jours), mais avec une carte graphique classique, ma mauvaise conscience s’incline et me dit que je ne devrais pas utiliser des textures aussi volumineuses.

Quelle est la méthode préférée de nos jours? S'agit-il de simplement mettre cette chose dans la mémoire vidéo, de la placer en mosaïque ou de laisser le processeur effectuer le travail et effectuer le glDrawPixels? Ou quelque chose de plus élaboré?

Était-ce utile?

La solution

S'il s'agit d'une image splash d'une seule image sans animations, l'utilisation de glDrawPixels ne présente aucun danger. Si les performances sont essentielles et que vous devez utiliser une texture, la méthode appropriée consiste à déterminer, au moment de l'exécution, la taille de texture maximale prise en charge, à l'aide d'une texture proxy.

GLint width = 0;
while ( 0 == width ) {  /* use a better condition to prevent possible endless loop */
    glTexImage2D(GL_PROXY_TEXTURE_2D, 
                      0,                /* mip map level */
                      GL_RGBA,          /* internal format */
                      desiredWidth,     /* width of image */
                      desiredHeight,    /* height of image */
                      0,                /* texture border */
                      GL_RGBA           /* pixel data format, */ 
                      GL_UNSIGNED_BYTE, /* pixel data type */
                      NULL              /* null pointer because this a proxy texture */
    );

    /* the queried width will NOT be 0, if the texture format is supported */
    glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);

    desiredWidth /= 2; desiredHeight /= 2;
}

Une fois que vous connaissez la taille de texture maximale prise en charge par le pilote OpenGL du système, vous avez au moins deux options si votre image ne vous convient pas:

  • Mosaïque d'image : utilisez plusieurs quadruples après avoir divisé votre image en fragments plus petits pris en charge. La mosaïque d'image pour quelque chose comme un écran de démarrage ne devrait pas être trop délicate. Vous pouvez utiliser les glPixelStorei . code> GL_PACK_ROW_LENGTH pour charger des sections d’une image plus grande dans une texture.
  • Redimensionnement de l'image : redimensionnez votre image pour l'adapter à la taille de texture maximale prise en charge. Il existe même une fonction d'assistance GLU pour le faire à votre place, gluScaleImage .

Autres conseils

Je ne pense pas qu’il existe une fonction opengl intégrée, mais vous pourriez trouver une bibliothèque (ou écrire la fonction vous-même) pour décomposer l’image en morceaux plus petits, puis imprimer à l’écran les morceaux plus petits (128x128 similaire).

J'avais un problème avec cela en utilisant Slick2D pour un jeu Java. Vous pouvez consulter leur " BigImage " classe pour les idées ici .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top