OpenGL ES peut-il rendre des textures de dimensions non base 2?
C'est juste une petite question avant de me plonger plus profondément dans la conversion de mon système de rendu openGL. J'ai entendu dire que les textures nécessaires pour être en base 2 tailles afin d'être stockées pour le rendu. Est-ce vrai?
Ma demande est très serré sur la mémoire, mais la plupart des images ne sont pas des puissances de deux. Ne le stockage de non-base 2 textures consomment plus de mémoire?
source d'informationauteur Kleptine
Vous devez vous connecter pour publier un commentaire.
C'est vrai en fonction de l'OpenGL ES version OpenGL ES 1.0/1.1 ont le pouvoir de deux de restriction. OpenGL ES 2.0, qui n'ont pas de limitation, mais il restreindre les modes de transition pour les non puissance de deux textures.
La création de plus de textures pour correspondre POT dimensions déchets de mémoire de texture.
Suresh, la puissance de 2 la limitation a été construit en OpenGL retour dans le (très) premiers jours de l'informatique graphique (avant abordables accélération matérielle), et il a été fait pour des raisons de performances. Faible niveau de code de rendu obtient un rendement décent boost quand il peut être codé en dur pour une puissance de deux textures. Même modernes GPU, POT textures sont plus rapides que NPOT de textures, mais la différence de vitesse est beaucoup plus petite qu'elle ne l'habitude d'être (même s'il peut encore être visible sur de nombreux dispositifs ES).
GuyNoir, ce que vous devriez faire est de construire une texture atlas. Je viens de résoudre ce problème moi-même ce week-end passé pour mon propre jeu Android. J'ai créé une catégorie appelée TextureAtlas, et son constructeur appelle glTexImage2D() pour créer une grande texture de n'importe quelle taille je choisir (passage de la valeur null pour les valeurs de pixel). Ensuite, je peux appeler add(id, bitmap), qui appelle glTexSubImage2D(), à plusieurs reprises emballer dans le plus petit des images. Le TextureAtlas classe des pistes utilisé et l'espace disponible à l'intérieur de la plus grande texture et les rectangles chaque image est stockée dans. Ensuite, le code de rendu peut appeler get(id) pour obtenir le rectangle pour une image à l'intérieur de l'atlas (qui peut convertir des coordonnées de texture).
Note #1: le Choix de la meilleure façon d'emballer dans différentes texture de tailles n'est PAS une tâche triviale. J'ai choisi de commencer par une simple logique dans la TextureAtlas classe (pensez à la machine à écrire + retour chariot + saut de ligne) et assurez-vous que je charge les images dans le bon ordre afin de profiter de cette logique. Dans mon cas, c'était de commencer par le plus petit carré-ish images et de travailler mon chemin jusqu'à la moyenne des carrés-ish images. Puis-je charger tout court+à l'échelle des images, la force d'un CR+LF, et puis la charger toute hauteur+skinny images. Je charge la plus grande place-ish dernières images.
Note #2: Si vous avez besoin de plusieurs texture atlas, essayez de regrouper les images à l'intérieur de chaque qui sera rendue à minimiser le nombre de fois que vous avez besoin pour passer des textures (ce qui peut tuer la performance). Par exemple, dans mon jeu Android j'ai mis tout le statique de la planche de jeu des éléments dans un atlas et toutes les images de différents effets d'animation dans un deuxième atlas. De cette façon, je peux lier atlas #1 et tout dessiner sur le plateau de jeu, alors je peux lier atlas #2 et tirer tous les effets spéciaux sur le dessus de cela. Deux texture sélectionne par image est très efficace.
Note #3: Si vous avez besoin de répéter/mise en miroir de textures, ils doivent aller dans leurs propres textures, et vous devez les mettre à l'échelle (pas d'ajouter des pixels noirs de remplir les bords).
Non, ça doit être un 2base. Cependant, vous pouvez contourner ce problème en ajoutant des barres noires en haut et/ou bas de votre image, puis en utilisant les coordonnées de texture de la matrice de restreindre où la texture sera mappé à partir de votre image. Par exemple, disons que vous avez un 13 x 16 pixel de la texture. Vous pouvez ajouter 3 pixels de noir sur le côté droit puis effectuez les opérations suivantes:
Maintenant, vous avez un 2base fichier image, mais d'un non-2base texture. Assurez-vous simplement d'utiliser la mise à l'échelle linéaire 🙂
C'est un peu tard, mais Non puissance de 2 textures sont pris en charge en vertu de l'OpenGL ES 1/2 grâce aux extensions.
La principale est GL_OES_texture_npot. Il est également GL_IMG_texture_npot et GL_APPLE_texture_2D_limited_npot pour les appareils iOS
Vérifier ces extensions en appelant
glGetString(GL_EXTENSIONS)
et la recherche de l'extension dont vous avez besoin.Je voudrais également vous conseillons de conserver vos textures de tailles qui sont des multiples de 4, comme certains le matériel s'étend textures si ce n'.