调用gluLookAt时的GL_INVALID_OPERATION

时间:2014-01-23 16:27:49

标签: macos opengl glulookat

我最近在OS X上进入OpenGL(tl;博士:我是一个OpenGL noob)并且得到了一些可以绘制立方体的代码。但是,由于我的视图没有被翻译,所以我看不到任何面孔(除了正面)。我尝试使用gluLookAt函数执行此转换,但出现GL_INVALID_OPERATION错误。这就是我渲染的方式:

// Activate and lock context
[_glView.openGLContext makeCurrentContext];
CGLLockContext(_glView.openGLContext.CGLContextObj);

// Update camera position
gluLookAt(0, 2.0, 0, 0, 0, 0, 0, 1, 0);
gl_GetError();

// Update viewport and render
glViewport(0, 0, _glView.frame.size.width, _glView.frame.size.height);
[_renderer doRender:time];

// Unlock and flush context
CGLUnlockContext(_glView.openGLContext.CGLContextObj);
[_glView.openGLContext flushBuffer];

当我注释掉gluLookAt调用时,此代码有效,而且我可以从文档中收集内容,此错误是由gluLookAt和{{1}之间执行glBegin引起的}。我不知道这些被调用的地方,因为我自己不打电话给那些人,并且在glEndgluLookAt中将呼叫包裹到glBegin并不能解决问题。

如果它有所作为,我正在使用OpenGL 3.2 Core Profile。

1 个答案:

答案 0 :(得分:2)

顺便说一句,gluLookAt (...)(以及一般的GLU)不是OpenGL的一部分。这就是为什么你不会找到直接解释这个错误原因的文档。

它生成GL_INVALID_OPERATION的唯一原因是因为它在幕后执行此操作:glMultMatrixf (...)(其中 是GL的一部分一段时间)。这在核心配置文件上下文中是无效的,因为不再有矩阵堆栈; GL 3.0或3.1中已弃用的任何内容均已从GL 3.2(核心配置文件)中删除

如果在OS X上需要gluLookAt /矩阵堆栈功能,GLKit提供了一组合适的替换实用程序。或者,如果使用Objective C ++进行编译,则可以使用更加可移植(基于C ++)的库GLM


现在,这里更简单的解决方案是不使用核心配置文件上下文。如果您使用的是gluLookAt (...)之类的东西,那么您很可能会学习传统的OpenGL。您需要一个支持OpenGL弃用部分的上下文,而在OS X上,这意味着您需要一个2.1上下文。