Question

Je dois afficher des images 2D en opengl à l'aide de textures.
Les dimensions de l'image ne sont pas nécessairement des puissances de 2.
J'ai pensé créer une texture plus grande et limiter l'affichage à la partie que j'utilisais, mais les données de l'image seront partagées avec openCV. Par conséquent, je ne veux pas copier les données pixel par pixel dans une texture plus grande.

EDIT - il s’avère que même les cartes Intel intégrées les plus simples sous Windows prennent en charge les textures sans puissance supérieure à 2.

EDIT2 - et même si vous n’avez pas la taille de la texture arbitraire, réduisez votre image et redimensionnez-la à la taille de la fenêtre, elle est très rapide même sur du matériel bas de gamme

Était-ce utile?

La solution

Quelques extensions de GL viennent à l’esprit. Consultez GL_ARB_texture_rectangle (si vous n'avez pas besoin de mipmapping) ou GL_ARB_texture_non_power_of_two (si vous le faites).

Autres conseils

Un écueil à éviter est que, pour une raison quelconque, certaines cartes vidéo exigent que GL_UNPACK_ALIGNMENT soit défini sur 1 (glPixelStorei (GL_UNPACK_ALIGNMENT, 1);) pour le chargement correct de la texture dont la puissance est différente de deux.

Si je peux simplement ajouter quelque chose pour ceux qui rencontreront cela à l'avenir - la plupart de la documentation et des tutoriels / exemples que vous trouverez sur le Web à propos d'OpenGL sont périmés depuis de nombreuses années, y compris dans le domaine nehe.gamedev, et vous guideront. de croire que des choses comme les tailles de texture différentes de la puissance des deux posent un problème lorsqu'elles ne le sont pas, ou vous inciter à utiliser des fonctions opengl obsolètes ou des bibliothèques qui n'ont pas été mises à jour depuis une décennie.

Tout d’abord, la plupart des cartes vidéo modernes prennent en charge des dimensions de texture non carrées et non redondantes. Mais pour une compatibilité maximale, il est probablement recommandé d’utiliser uniquement la puissance de deux textures.

Commencez par déterminer la puissance la plus proche de deux, supérieure pour chacune des dimensions de l'image (largeur et hauteur), puis créez une texture de cette taille. Ensuite, vous avez deux options. La première consiste à redimensionner à l'aide d'un logiciel les données de pixels pour les adapter à l'image, puis à redimensionner votre quad en fonction du format d'origine lorsque vous souhaitez l'afficher. Ou bien, vous pouvez simplement remplir une partie de la texture avec vos données d'image et ajouter des pixels transparents.

Si vous souhaitez utiliser la puissance de 2 textures, créez la plus petite qui puisse occuper votre image et calculez les coordonnées de texture appropriées pour afficher uniquement la partie de la texture contenant votre image. Par exemple. si votre image mesure 400 x 300, vous utiliseriez une texture de 512 x 512, copiez-la ligne par ligne et la coordonnée de votre texture droite serait 400,0 / 512,0, la plus basse 300,0 / 512,0. Cela aura l'air mieux que la mise à l'échelle logicielle.

Je fais exactement ce que vous décrivez, copiez-le dans une texture puissance de 2 et ajustez mes UV en conséquence. Les extensions seraient utiles, mais vous n'êtes pas assuré qu'elles soient prises en charge sur un ordinateur arbitraire.

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