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
Répondre
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);
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.
Quelle version d'OpenGL ES, 1 ou 2? –
J'utilise ES 1. – nomann