2014-01-23 87 views
0

我最近在OS X上進入OpenGL(tl; dr:我是OpenGL noob),並得到了一些代碼工作,繪製了一個立方體。然而,我沒有看到任何面孔(除了前面),因爲我的觀點沒有被翻譯。我嘗試使用gluLookAt函數來做這個翻譯,但是我得到一個GL_INVALID_OPERATION錯誤。這是我做我的渲染:GL_INVALID_OPERATION當調用gluLookAt

// 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號召,從我可以從文檔收集此代碼的工作,這個錯誤是由glBeginglEnd之間執行gluLookAt引起的。我不知道這些是在哪裏接到電話,因爲我自己並沒有給他們打電話,並且打電話給gluLookAtglBeginglEnd沒有解決問題。

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

+1

看着opengl標籤的人一定要四處走動,幾乎所有問題都沒有評論。這真是讓我煩惱。 – thokra

+0

@thokra我只是再次投票。如果你認爲一個問題是不好的,解釋原因,沒有任何藉口。 –

+0

@AntonD:所以你低估了,然後再次投票,因爲你無法給出解釋?我有點困惑。 – thokra

回答

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上下文。

+1

+1:另外,[GLM](http://glm.g-truc.net/0.9.5/index.html)是一個很好的庫,它取代了一些GLU函數,包括'glmLookAt()'。 – thokra

+0

我曾考慮提及,但我不確定它是否可以在Objective C應用程序中工作。 –

+0

哦,我沒有看到這是客觀的C.你可以與ObjC中的C++代碼接口嗎? – thokra