0

我最近一直在 OS X 上使用 OpenGL(tl;博士:我是 OpenGL 菜鸟)并且得到了一些可以绘制立方体的代码。但是,我没有看到任何面孔(除了前面),因为我的视图没有被翻译。我尝试使用该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调用时,这段代码有效,从我从文档中收集到的信息来看,这个错误是由在 and 之间执行引起gluLookAt的。我不知道这些是否在哪里被调用,因为我自己不调用它们,并且将调用包装起来并不能解决问题。glBeginglEndgluLookAtglBeginglEnd

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

4

1 回答 1

2

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

它生成的唯一原因GL_INVALID_OPERATION是因为它在幕后这样做:(glMultMatrixf (...)曾经GL 的一部分)。这在核心配置文件上下文中是无效的,因为不再有矩阵堆栈;GL 3.0 或 3.1 中已弃用的任何内容都将从 GL 3.2(核心配置文件)中删除。

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


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

于 2014-01-23T16:44:41.923 回答