3

所以我一直在做一些 iphone 开发,里面有一些 OpenglES,但是当我在效果上调用 prepareToDraw 时,我遇到了一个相当奇怪的错误。简而言之,我的程序模拟掷骰子(尝试学习objective-c和opengl)。该程序在大多数情况下运行良好,我可以使用我为我的应用程序编写的所有内容(其物理错误但稍后会修复)。在我使用了包含 OpenGL 的部分之后,问题就出现了。

该程序包含 2 个菜单,您必须通过才能到达使用 OpenGL 的屏幕,一旦您使用了应用程序 OpenGL 部分并返回上一个菜单,然后再次尝试返回 OpenGL 部分,我得到一个打印出 GL ERROR: 0x0501。根据我的效果,我将其缩小为由 prepareToDraw 方法引起的。关于它的另一个奇怪的部分是,如果我回去,然后再前进,OpenGL 再次工作,并且可以一次又一次地重复,以便它在你进入 OpenGL 部分时每两次工作和中断。

我一直在寻找与我类似的问题,但每次它都与加载不是二次幂纹理的纹理有关,这对我没有帮助,因为我什至还没有使用纹理,只是彩色顶点。

我粘贴了我的两个代码文件,问题应该出在哪里

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

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

我希望有人遇到同样的问题并且可以回答我的问题,我希望这不仅仅是一个愚蠢的错误,因为我已经尝试解决这个问题一段时间了:)

谢谢

4

2 回答 2

10

经过许多痛苦和折磨,我终于找到了解决问题的方法。我不完全确定为什么这是一个问题,但在 OpenGL 部分(又名 RollViewController.m)中创建上下文并不是这样做的方法。相反,您应该在程序的整个生命周期中创建它一次,并将您的当前上下文设置为您的 glkview 为您创建的上下文。也许有人可以启发我为什么重新创建上下文是一个坏主意。

在我的代码中,我有一个在视图和菜单之间传递的配置文件对象,以便它们都可以与相同的数据进行通信,所以我只是在我的配置文件对象中定义了一个公共上下文,以便所有内容都可以访问上下文而不是创建他们自己的(和打破)。

于 2012-05-28T13:37:55.197 回答
0

该错误似乎很普遍,可能是由于不同的问题。我通过不使用 mipmap 避免了它(现在)。我评论了我拥有的以下代码并且不再有错误。

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)

于 2014-06-09T17:59:59.227 回答