Как загрузить и отобразить изображение в OpenGL ES для iphone

Я новичок и пытаюсь отобразить спрайт на экране iPhone с помощью OpenGL ES. Я знаю, что это намного проще и проще сделать с cocos2d, но теперь я пытаюсь закодировать непосредственно на OpenGL. Есть ли простой, но эффективный способ загрузки и отображения спрайтов в OpenGL ES. То, что я нашел до сих пор, намного сложнее.: (

Ответ 1

Вот некоторый код для загрузки png из пакета:

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

Вот некоторый код для создания текстуры с данными этого изображения.

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

И пример того, как это сделать:

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)

Здесь вам нужно найти значения вершин, нормалей и текстур, которые соответствуют вашим потребностям.

Обновление 1

Не забудьте установить правильные состояния следующим образом:

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

Если вы используете glOrthof (см. ниже) для установки 2D-проекции в своем приложении, вы можете использовать следующие значения:

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

Обновление 2

Вот как я сидел в режиме проекции при использовании приведенного выше кода для визуализации спрайтов:

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

И вот как я установил свою функцию смешивания. Это обеспечивает прозрачность в файлах png:

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

Ответ 2

Я рекомендую посмотреть приложение Apple GLSprite. Это именно то, что делает это приложение.

Если вы хотите загрузить текстуры, сжатые PVRTC, посмотрите на их PVRTextureLoader. Я использую код из этого в пример приложения, который я написал для своего класса iPhone.