我最近一直在OS X上进入OpenGL(TL; DR:我是OpenGL Noob),并获得了一些绘制Cube的代码。但是,我看不到任何面孔(除前面),因为我的视图没有翻译。我尝试使用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
调用时,此代码可行,并且从文档中可以收集的内容时,此错误是由glBegin
和glEnd
之间执行gluLookAt
引起的。我不知道这些是在哪里打电话的,因为我自己不打电话给那些人,并且在glBegin
中打电话给gluLookAt
,而glEnd
无法解决问题。
如果有所不同,我正在使用OpenGL 3.2核心配置文件。
顺便说一句, gluLookAt (...)
(和Glu通常)不是OpenGL的一部分。这就是为什么您找不到直接解释此错误原因的文档的原因。
它生成GL_INVALID_OPERATION
的唯一原因是因为它在场景后面这样做:glMultMatrixf (...)
(是 GL的一部分一次)。在核心配置文件上下文中,这是无效的,因为没有矩阵堆栈了。GL 3.0或3.1中的GL 3.0或3.1中的任何 dovectect 都从3.2(核心配置文件)中删除了。
如果您需要OS X上的gluLookAt
/矩阵堆栈功能,则GLKIT提供了合适的替换实用程序集合。另外,如果使用目标C 编译,则可以使用更便宜的(基于C 的)库。
现在,这里更简单的解决方案不是使用核心配置文件上下文。如果您使用的是gluLookAt (...)
之类的东西,则可能正在学习Legacy OpenGL。您需要一个支持OpenGL弃用部分的上下文,在OS X上,这意味着您需要2.1上下文。