我正在编写一个漂亮的小游戏,它使用着色器生成的单工噪声来显示随机计算的随机地形。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,而程序的其余部分不显示任何错误。
我没有试过glGetError()。它提供了错误代码1282(0x502,GL_INVAILD_OPERATION)。 另外我已经验证我只使用一个线程。 – Ashlaban
然后你必须跟踪错误。确保哪个调用会导致错误(它可能来自'glUniform1f()'调用之前,因此请确保通过前后检查),那么您将必须检查罪魁祸首的文档以了解它的含义。 –
谢谢你的帮助! 似乎我需要做的是在将制服传递给着色器之前添加对glGetError()的调用。我不知道为什么,但现在程序运行正常。 – Ashlaban