2010-06-10 7 views
5

Je suis conscient que les textures OpenGL sur l'iphone doivent avoir une puissance de 2, est-ce vrai aussi pour OpenGL 2.0? Si j'ai une image de 320 x 480 et que je veux la dessiner en plein écran, il existe un moyen de le faire avec OpenGL.Texture plein écran iPhone OpenGL ES

Merci

Répondre

10

Les textures NPOT sont prises en charge sur le matériel PowerVR SGX, mais ont des restrictions. Les textures NPOT ne peuvent pas utiliser de mipmaps, doivent être en 2D (pas de cubes-maps ou de textures 3D) et doivent utiliser le GL_CLAMP_TO_EDGE pour l'habillage de texture dans les deux dimensions; cela est pris en charge par défaut dans OpenGL ES 2.0 et sous ES 1.1 par l'extension GL_APPLE_texture_2D_limited_npot

Pour ES 1.1, vous pouvez vérifier lors de l'exécution pour voir si cette extension est présente avec ce code:

const char* extensions = (char*) glGetString(GL_EXTENSIONS); 
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0; 

Depuis cette est seulement présent sur le SGX et non sur le MBX, sachez que en s'appuyant sur le support de texture NPOT vous limitera aux nouveaux périphériques SGX. Bien sûr, s'appuyer sur ES 2.0 fera de même, donc si c'est votre objectif, le support NPOT est un point discutable et vous pouvez aller de l'avant avec les textures NPOT.

Voici une autre solution qui vous permet de continuer à utiliser ES 1.1 et de conserver la prise en charge complète des périphériques. Placez la texture 320x480 dans un 512x512, remplissez l'espace avec d'autres carreaux d'arrière-plan, glyphes ou autres textures qui seront dessinées en même temps (pour éviter plusieurs appels glBindTexture), puis utilisez l'une de mes extensions ES 1.1 préférées, GL_OES_draw_texture, pour copier rapidement la section 320x480 sur la fenêtre:

int rect[4] = {0, 0, 480, 320}; 
glBindTexture(GL_TEXTURE_2D, texBackground); 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect); 
glDrawTexiOES(0, 0, z, 480, 320); 

Encadré: la spécification OpenGL ES 2.0 ne précise pas de restrictions sur les textures NPOT; à moins que je ne me trompe, Apple impose ses limites - bien sûr, dans le monde ES 1.1, le support NPOT n'existe pas du tout, donc c'est un ajout.

+0

Merci Chris, très bonne info. Excusez-moi d'être un noob, mais quel est le paramètre z dans glDrawTexiOES()? profondeur? Je n'arrive pas à trouver de documentation. Merci –

+0

@Ben: Oups, désolé à ce sujet. Z est la profondeur du rectangle - 0 est le plan proche, 1 est le plan lointain, et les valeurs décimales vous donnent le pourcentage de la distance qui les sépare. Dans l'exemple ci-dessus, c'était pour une scène strictement 2D gérant sa propre profondeur avec «l'algorithme du peintre» donc z = 0; Pour la plupart des utilisations d'arrière-plans, vous aurez besoin de z = 1 sauf si vous avez inversé votre plage de profondeur. La page de spécification OpenGL l'énonce un peu mieux: (http://www.khronos.org/registry/gles/extensions/OES/OES_draw_texture.txt - environ à mi-chemin de la page) Effacer comme de la boue? :) –

1

En supposant que vous n'avez pas trop de textures plein écran, vous pouvez simplement utiliser une texture 512x512 et utiliser uniquement 320x480 de celui-ci. Ça va certainement marcher.

1

Je suppose que cela dépend du matériel. J'ai l'habitude de créer la puissance la plus proche de 2 texture i.e si ma texture est 320x480 alors je vais créer une texture de 512x512 qui aura les données de texture d'origine. ceci assure la portabilité mais consomme un peu plus de mémoire;)