【问题标题】:Textures with GLKView and OpenGLES 1.1?GLKView 和 OpenGLES 1.1 的纹理?
【发布时间】:2012-01-26 06:20:43
【问题描述】:

我在获取纹理以使用 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);

其余的基本上是对我的旧渲染引擎的调用,然后它将顶点数据发送到 OpenGL,但我认为应该没问题,因为它可以在旧代码中工作。 那么我在这里想念什么?任何帮助将不胜感激。

【问题讨论】:

  • 哇,不知道StackOverflow从一开始就去掉了问候语……

标签: opengl-es ios5 textures glkit


【解决方案1】:

听起来你有一个类似this one的问题,即:你的纹理没有预乘alpha。

【讨论】:

    【解决方案2】:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多