Mac OSX上的OpenGL更新制服

时间:2011-09-07 00:04:36

标签: objective-c macos opengl

我正在编写一个漂亮的小游戏,它使用着色器生成的单一噪声来显示飞行计算的随机地形。

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

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

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

我部分成功了。屏幕更新完全按照我想要的前30帧,然后它停止更新制服,即使我调用glUniform1f()和NSLog紧挨着彼此,NSLog总是触发..!

奇怪的是,如果按下一个保持空间(或任何其他关键),则应更新制服。

显然,我在这里遗漏了一些关于OSX或OpenGL或其他东西处理制服的事情。

对于可能会困扰我的内容的解释将不胜感激,但指向我可以找到有关此信息的地方就足够了。

更新:在摆弄glGetError()glGetUniform*()之后,我注意到该程序在单独使用时可以正常运行。但是,当我使用触控板进行输入时,制服会重置为0.000,而程序的其余部分则没有显示错误。

1 个答案:

答案 0 :(得分:0)

首先,您是否尝试在glGetError()之后立即致电glUniform1f(),看看会发生什么?

我对Mac OS编程的了解非常有限(两年前我做了一些iOS编程,从那时起就忘记了大部分内容)所以以下是一个疯狂的猜测。

您确定drawRect:(NSRect)dirtyRect与拥有OpenGL上下文的线程在同一个线程中调用吗?据我所知,OpenGL不是线程安全的,所以可能是你的glUniform1f()尝试是从另一个线程调用的,因此无法做任何事情。