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

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

10
задан nomann 2 August 2010 в 11:09
поделиться

2 ответа

Вот код для загрузки 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);
16
ответ дан 3 December 2019 в 19:31
поделиться

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

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

4
ответ дан 3 December 2019 в 19:31
поделиться