使用GLKView和OpenGLES 1.1的纹理?

时间:2012-01-26 06:20:44

标签: opengl-es ios5 textures glkit

我无法使用iOS 5方式(使用GLKView)使用纹理来使用旧式的OpenGLES 1.1。我正在迁移旧的2D(精灵)风格的游戏框架。我在Xcode中使用了OpenGL游戏的库存示例,并修改了它以使用kEAGLRenderingAPIOpenGLES1初始化EAGLContext。我也没有尝试使用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);

问题从这里开始,我从上面的最后一行得到了OpenGL的0x0500错误。我无法弄清楚,有什么区别,因为这在旧代码中工作正常(或者至少如果没有,那么它不是问题的根源)。如果我使用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,但我认为应该没问题,因为它适用于旧代码。 那我在这里想念什么?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

听起来你有类似于this one的问题,那就是:你的纹理没有预乘alpha。

答案 1 :(得分:0)

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生成的模板不同的模板,并使用CAEAGLLayer构建您自己的UIView。