GLKBaseEffect准备绘制GL错误:0x0501。

3
我一直在做一些带有OpenglES的iPhone开发,但是当我调用我的效果的prepareToDraw方法时,我遇到了一个非常奇怪的错误。我的程序简单地模拟掷骰子(试图学习Objective-C和OpenGL)。这个程序大部分都很好用,我可以使用我编程应用程序的所有功能(物理上的错误我会稍后修复)。问题出现在我使用包含OpenGL的部分之后。
该程序包含两个菜单,您必须按顺序通过它们才能到达使用OpenGL的屏幕。一旦您使用了应用程序的OpenGL部分并返回到前一个菜单,然后再次尝试返回到OpenGL部分,我会得到一个打印输出,显示GL ERROR:0x0501。我已经缩小了问题范围,发现它是由我的效果的prepareToDraw方法引起的。另一个奇怪的部分是,如果我返回并再次前进,OpenGL就会再次工作,并且可以重复多次,每次进入OpenGL部分时都会工作和中断。
我一直在寻找类似于我的问题的解决方案,但每次都与加载不是2的幂纹理有关,这对我没有帮助,因为我甚至还没有使用纹理,只是彩色顶点。
我已经pastebin'd了我的两个代码文件,其中问题应该存在。

Dice.m: http://pastebin.com/ze1DEEzs 在draw方法中,您会看到我的输出缩小了问题所在的范围,即prepareToDraw方法。(第308行)

RollViewController.m: http://pastebin.com/VycwAh3R 这个文件是我设置效果和上下文等的地方,所以我一定在这里做错了什么,导致每次运行程序的OpenGL部分时prepareToDraw方法出现问题。我有一种感觉,这与没有释放某种与上下文和效果相关的资源有关,但我找不到关于删除上下文和效果的任何信息(可能是因为您不需要,但我不确定)。

我希望有人遇到过同样的问题并能回答我的问题,也希望这不只是一个愚蠢的错误,因为我已经试图解决这个问题有一段时间了 :)

谢谢

2个回答

10

经过长时间的痛苦和挣扎,我终于找到了解决问题的方法。我不太确定为什么会出现这个问题,但是在OpenGL部分(即RollViewController.m)内创建上下文并不是解决问题的正确方法。相反,您应该在程序的生命周期内仅创建一次,并将您所创建的上下文设置为GLKView的当前上下文。也许有人可以向我解释一下为什么重新创建上下文是一个坏主意。

在我的代码中,我有一个配置文件对象,在视图和菜单之间传递,以便它们可以使用相同的数据进行通信,因此我只需在配置文件对象中定义一个公共上下文,这样所有东西都可以访问上下文而不是创建他们自己的上下文(并破坏整个程序)。


我也遇到了同样的问题,你介意分享一下你的方法吗?谢谢! - sooon
1
所有你需要做的是确保你在应用程序的生命周期中只初始化一次EAGLContext。如果你只有一个带有OpenGL视图的视图,你可以只创建一个静态的EAGLContext并赋值一次。否则使用单例模式。另外,你可以执行[EAGLContext setCurrentContext:[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]]一次,然后在此之后每次使用[EAGLContext setCurrentContext:[EAGLContext currentContext]] - Fonix
谢谢您先生!采用单例模式来避免检查上下文是否已经创建。 - Christoph

0

这个错误似乎很普遍,可能是由于不同的问题引起的。我通过不使用mipmaps来避免它(暂时)。我注释了我之前的以下代码,现在就没有错误了。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); glGenerateMipmap(GL_TEXTURE_2D)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接