Текстуры с GLKView и OpenGLES 1.1?

У меня проблемы с тем, чтобы текстуры работали способом iOS 5 (с использованием GLKView), но со старомодным OpenGLES 1.1. Я переношу старый игровой фреймворк в стиле 2D (спрайты). Я взял стандартный пример игры OpenGL в Xcode и изменил его, чтобы инициализировать EAGLContext с помощью kEAGLRenderingAPIOpenGLES1. Я также не пытаюсь использовать GLKTextureLoader и GLKBaseEffect, поскольку у меня есть старые алгоритмы загрузчика текстур (а базовый эффект работает с шейдерами). Вот что у меня сейчас во ViewController:

- (void)viewDidLoad {
[super viewDidLoad];

[self setContext : [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]];
[EAGLContext setCurrentContext: [self context]];

GLKView *view = (GLKView *)self.view;
[view setContext: [self context]];
[view setDrawableDepthFormat: GLKViewDrawableDepthFormatNone];
[view setDrawableColorFormat: GLKViewDrawableColorFormatRGBA8888];
[view setMultipleTouchEnabled: NO];
[self setupGL];
}

И в setupGL:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, backingWidth, 0, backingHeight, -1, 1);
glViewport(0, 0, backingWidth, backingHeight);    
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//landscape mode
glTranslatef(backingWidth/2, backingHeight/2, 0);
glRotatef(90, 0, 0, 1);
glTranslatef(-backingHeight/2, -backingWidth/2, 0);

glDisable(GL_DEPTH_TEST);

glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);    
glEnableClientState(GL_VERTEX_ARRAY);    
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ALPHA);

Проблемы начинаются здесь, я получаю сообщение об ошибке 0x0500 от OpenGL с последней строкой выше. Я не могу понять, в чем разница, потому что это нормально работает в старом коде (или, по крайней мере, если нет, то это не источник проблемы). Если я использую GL_MODULATE вместо GL_APLHA, то ошибки GL нет, но текстуры все равно не работают. Вот как я их загружаю:

glGenTextures(1, &textures[textureNum]);
glBindTexture(GL_TEXTURE_2D, textures[textureNum]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

Остальное - это в основном вызов моего старого renderEngine, который затем отправляет данные вершин в OpenGL, но я полагаю, что это должно быть нормально, поскольку он работает в старом коде. Так чего мне здесь не хватает? Любая помощь будет оценена.


person fishgen    schedule 26.01.2012    source источник
comment
Ух ты, не знал, что StackOverflow с самого начала убирает приветствия ...   -  person fishgen    schedule 26.01.2012


Ответы (2)


Похоже, у вас есть проблема, аналогичная этой, а именно: ваша текстура не имеет предварительного умножения альфа.

person Germano    schedule 18.04.2012

GLKit построен на OpenGL ES 2.0, а не на 1.1. Из примечаний к выпуску iOS 5.0:

Платформа GLKit (GLKit.framework) содержит набор служебных классов на основе Objective-C, которые упрощают усилия, необходимые для создания приложения OpenGL ES 2.0.

Он не предназначен для использования с контекстом OpenGL ES 1.1, и классы GLKit не должны работать при использовании в таком контексте. Даже для чего-то столь же простого, как настройка фреймбуфера, 2.0 использует функции с разными названиями, чем 1.1 для тех же задач.

Если вы намерены создать проект OpenGL ES 1.1 по какой-либо причине, начните с шаблона, отличного от шаблона, созданного Xcode, и создайте свой собственный UIView, поддерживаемый CAEAGLLayer.

person Brad Larson    schedule 18.04.2012