Я новичок и пытаюсь отобразить спрайт на экране iPhone с помощью OpenGL ES. Я знаю, что это намного проще и проще сделать с cocos2d, но теперь я пытаюсь закодировать непосредственно на OpenGL. Есть ли простой, но эффективный способ загрузки и отображения спрайтов в OpenGL ES. То, что я нашел до сих пор, намного сложнее.: (
Как загрузить и отобразить изображение в OpenGL ES для iphone
Ответ 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.