2011-09-07 73 views
1

我正在编写一个漂亮的小游戏,它使用着色器生成的单工噪声来显示随机计算的随机地形。OpenGL在Mac OSX上更新制服

我使用的Objective-C和Xcode 4,我已经得到了一切运行良好使用NSOpenGLView的子类。子类首先编译着色器,然后渲染带有噪声纹理的四边形。程序没有问题以可接受的速度运行(60Hz)。

NSOpenGLView的子类使用NSRunLoop来触发选择器,该选择器又调用drawRect:(NSRect)dirtyRect。这是每帧完成的。

现在,我希望着色器使用每帧更新的统一。 着色器应该能够对每帧可能发生的变化做出反应,因此我试图以此频率更新制服。统一的更新在drawRect:(NSRect)dirtyRect函数中完成。

我部分成功。屏幕更新完全像我想要的前30帧,然后它停止更新统一,即使我有一个调用glUniform1f()和NSLog的权利相邻,NSLog总是会触发..!

奇怪的部分是,如果持有空间按下(或任何其他关键)的统一更新,因为它应该是。

很明显,我错过了一些关于OSX或OpenGL或其他东西如何处理制服的东西。

解释什么可能会让我感到不满,但我会赞赏一个指向我可以找到关于这个信息的地方就足够了。

更新:glGetError()glGetUniform*()摆弄之后,我已经注意到,项目工程单独留在家中当你有意。但是,当我使用触控板进行输入时,制服重置为0.000,而程序的其余部分不显示任何错误。

回答

0

首先,你有没有试过在glUniform1f()之后试过打glGetError()看看会发生什么?

我对Mac OS编程知识非常有限(两年前我做了一些iOS编程,之后忘了它的大部分),所以下面是一个疯狂的猜测。

是否确定drawRect:(NSRect)dirtyRect由与拥有OpenGL上下文的线程相同的线程调用?据我所知,OpenGL不是线程安全的,因此可能是您的glUniform1f()尝试是从其他线程调用的,因此无法执行任何操作。

+0

我没有试过glGetError()。它提供了错误代码1282(0x502,GL_INVAILD_OPERATION)。 另外我已经验证我只使用一个线程。 – Ashlaban

+0

然后你必须跟踪错误。确保哪个调用会导致错误(它可能来自'glUniform1f()'调用之前,因此请确保通过前后检查),那么您将必须检查罪魁祸首的文档以了解它的含义。 –

+0

谢谢你的帮助! 似乎我需要做的是在将制服传递给着色器之前添加对glGetError()的调用。我不知道为什么,但现在程序运行正常。 – Ashlaban