2010-08-02 14 views
10

Je suis un débutant et j'essaie d'afficher un sprite sur mon écran d'iPhone en utilisant OpenGL ES. Je sais que c'est beaucoup plus simple et facile à faire avec cocos2d mais maintenant j'essaye de coder directement sur OpenGL. Existe-t-il un moyen simple et efficace de charger et d'afficher les sprites dans OpenGL ES? Ce que j'ai trouvé jusqu'à présent est beaucoup plus complexe. :(Comment charger et afficher l'image dans OpenGL ES pour iphone

+0

Quelle version d'OpenGL ES, 1 ou 2? –

+0

J'utilise ES 1. – nomann

Répondre

15

Voici un code pour charger un .png du paquet.

UIImage* image = [UIImage imageNamed:@"PictureName.png"]; 
GLubyte* imageData = malloc(image.size.width * image.size.height * 4); 
CGContextRef imageContext = CGBitmapContextCreate(imageData, image.size.width, image.size.height, 8, image.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast); 
CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, image.size.width, image.size.height), image.CGImage); 
CGContextRelease(imageContext); 

Voici un code pour créer une texture avec ces données d'image

GLuint texture; 
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.size.width, image.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

Et un exemple de rendre ceci:

glBindTexture(GL_TEXTURE_2D, texture); 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glNormalPointer(GL_FLOAT, 0, normals); 
glTexCoordPointer(2, GL_FLOAT, 0, textureCoords); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) 

ici, vous devez trouver les valeurs des sommets, et Normales textureCoords qui vous conviennent r besoins.

Update 1

Souvenez-vous de définir les bons états comme celui-ci:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

Si vous utilisez glOrthof (Voir ci-dessous) pour définir une projection 2D dans votre application, vous pouvez utiliser ces valeurs :

GLfloat vertices[] = { 
    -1.0, 1.0, 
    1.0, 1.0, 
    -1.0, -1.0, 
    1.0, -1.0, }; 

GLfloat normals[] = { 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0 }; 

GLfloat textureCoords[] = { 
    0.0, 0.0, 
    1.0, 0.0, 
    0.0, 1.0, 
    1.0, 1.0 }; 

Update 2

Voici comment je me suis assis le mode de projection lorsque vous utilisez le code ci-dessus pour rendre sprites:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-5.0, 5.0, -7.5, 7.5, -1, 1); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Et voilà comment je tournerai ma fonction de mélange. Cela permet à la transparence dans les fichiers .png:

glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

Thnx 4 ans Martin. Je vais certainement essayer ça. :) – nomann

+0

Toujours bon pour commencer avec les bases avant toute animation de fantaisie et tel ... Je suis aussi complètement nouveau pour les graphismes/trucs iPhone ... bon échantillon. – DRapp

4

Je recommande regarder l'exemple d'application d'Apple GLSprite. C'est exactement ce que cette application fait.

Si vous souhaitez charger des textures compressées par PVRTC, consultez leur exemple PVRTextureLoader. J'utilise le code de ceci dans un sample application que j'ai écrit pour ma classe d'iPhone.