2010-08-02 32 views
10

Soy un novato y trato de mostrar un sprite en la pantalla de mi iPhone usando OpenGL ES. Sé que es mucho más simple y fácil de hacer con cocos2d, pero ahora estoy tratando de codificar directamente en OpenGL. ¿Hay alguna manera simple pero eficiente de cargar y mostrar sprites en OpenGL ES? Lo que he encontrado hasta ahora es mucho más complejo. :(Cómo cargar y mostrar imágenes en OpenGL ES para iphone

+0

¿Qué versión de OpenGL ES, 1 o 2? –

+0

Estoy usando ES 1. – nomann

Respuesta

15

Aquí hay un código para cargar un png del paquete:.

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); 

Aquí hay un código para crear una textura con la que los datos de imagen

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); 

Y un ejemplo de cómo hacer esto:

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) 

Aquí tiene que encontrar los valores de los vértices, normales y textureCoords que le caben r necesita.

Actualización 1

Recuerde que debe establecer los estados correctos así:

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

Si utiliza glOrthof (ver más abajo) para establecer una proyección 2D en su aplicación, puede utilizar estos valores :

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 }; 

actualización 2

Esta es la forma en que me senté el modo de proyección cuando se utiliza el código anterior para hacer sprites:

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

Y así es como me puse mi función de mezcla. Esto permite la transparencia en los archivos PNG:

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

Thnx 4 ur tym Martin. Definitivamente intentaré eso. :) – nomann

+0

Siempre es bueno comenzar con lo básico antes de cualquier animación sofisticada y tal ... Yo también soy completamente nuevo en materia de gráficos/iPhone ... buena muestra. – DRapp

4

Yo recomiendo mirar aplicación GLSprite ejemplo de Apple. Eso es exactamente lo que hace esta aplicación.

Si desea cargar texturas comprimidas con PVRTC, consulte su ejemplo PVRTextureLoader. Utilizo el código de esto en un sample application que escribí para mi clase de iPhone.

Cuestiones relacionadas