Как загрузить и отобразить изображение в OpenGL ES для iphone - PullRequest
10 голосов
/ 02 августа 2010

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

Ответы [ 2 ]

16 голосов
/ 02 августа 2010

Вот код для загрузки 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)

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

Обновление 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);
4 голосов
/ 02 августа 2010

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

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

...