我正在编写一个漂亮的小游戏,它使用着色器生成的单一噪声来显示飞行计算的随机地形。
我正在使用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 :(得分:0)
首先,您是否尝试在glGetError()
之后立即致电glUniform1f()
,看看会发生什么?
我对Mac OS编程的了解非常有限(两年前我做了一些iOS编程,从那时起就忘记了大部分内容)所以以下是一个疯狂的猜测。
您确定drawRect:(NSRect)dirtyRect
与拥有OpenGL上下文的线程在同一个线程中调用吗?据我所知,OpenGL不是线程安全的,所以可能是你的glUniform1f()
尝试是从另一个线程调用的,因此无法做任何事情。