2013-01-10 36 views
3

對於獲取模型視圖矩陣,我似乎在glGetFloatv方面出現了一些意想不到的麻煩(這也發生在試圖抓取投影矩陣時) 。OpenGL總是返回cl-opengl(Common Lisp)中glGetFloatv GL_MODELVIEW_MATRIX的單位矩陣

會發生什麼?那麼,無論矩陣實際是什麼,該函數甚至在翻譯和旋轉之後立即返回單位矩陣!我知道矩陣不是身份矩陣,因爲在遊戲世界中移動時,屏幕上的視覺效果與預期完全相同。

我的功能是Common Lisp的代碼(用語句修改打印矩陣後它立即改變用於調試),並注意到以下這一點:

(defun apply-camera-gl (camera) 
    (declare (type scene-camera camera)) 
    (declare (optimize (speed 3) (safety 1) (debug 3) (space 0))) 
    "Passes the necessary OpenGL commands to apply the position and fov for the camera." 
    (let ((pos (scene-camera-position camera)) 
     (rot (scene-camera-rot camera)) 
     (fov (scene-camera-fov camera))) 
    (declare (type single-float rot fov) 
      (type vec3 pos)) 

    (gl:matrix-mode :projection) 
    (gl:load-identity) 
    (set-perspective fov +sr+ 0.1 24.0) 

    (gl:matrix-mode :modelview) 
    (gl:load-identity) 

    (gl:rotate -90.0 1.0 0.0 0.0) 
    (gl:rotate rot 0.0 0.0 1.0) 
    (gl:translate (- (the single-float (vec3-x pos))) 
        (- (the single-float (vec3-y pos))) 
        (- (the single-float (vec3-z pos)))) 

    ;; this always returns the following: 
    ;; mv = #(1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0) 
    (format t "mv = ~a~%" (gl:get-float :modelview-matrix)) 

    nil)) 

一些其他注意事項:

  • 我也試過,只是爲了看看會發生什麼,把打印輸出(GL:獲取浮動:模型視圖矩陣)在我的代碼早得多的其他地方在另一個文件中,在創建OpenGL上下文後字面上的權利,其中我應用了一些隨機旋轉和翻譯調用s - 並且它工作得很好,返回了我期望的矩陣!但是,在其他任何地方,它都會返回單位矩陣。我使用這個函數作爲例子,因爲它是最容易遵循的,即使對不熟悉Lisp的讀者也是如此。
  • 我只能在2001年初的某個時候在OpenGL論壇上找到一個谷歌在互聯網上搜索其他人的例子。不幸的是,這個線程結束於我的編程理智的噩夢 - 「LOL NEVERMIND,我發現了這樣的結論。
  • 我沒有使用固定管道,但即使現代OpenGL最佳實踐建議「在執行可編程管道時使用自己的矩陣」,但我從未讀過任何有關OpenGL禁用或以某種方式削弱了矩陣操縱功能的某些部分在使用可編程管線時,請關注OpenGL自己的矩陣。但是,可以肯定的是,我也嘗試了在某些代碼中封裝的get-float調用,該代碼暫時禁用了可編程管道,並且在固定管道模式下它仍然返回了單位矩陣。
  • 爲了確保這不是nvidia OpenGL驅動程序中的一些奇怪的錯誤,我設法在使用Intel圖形驅動程序的筆記本電腦上重現了這個奇怪的異常。相同的結果。
  • 這也發生在%gl:get-float-v,它將輸出轉儲到預分配的外部數組中,而不是像gl:get-float那樣返回一個Lisp數組。
  • 此外,在上面的代碼中,我之前嘗試過gl:finish(glFinish)以及gl:flush(glFlush)之後,在translate + rotate調用之後和get-float調用之前,對一些模糊的懷疑也許只是可能,某些事情正在發生故障。但這些添加沒有效果。
+0

是否這樣:http://www.opengl.org/discussion_boards/showthread.php/142432-why-does-glGetFloatv(GL_MODELVIEW_MATRIX)-return-Identity-matrix help? – Baggers

+0

@Baggers那是2001年的主題本來我提到與結束「沒關係,發現它,我不會和任何人我沒有修復它笑XD共享」的結論。我希望技術支持論壇有規則反對這種事情,就像他們強調反對拖釣,火焰傷害,種族主義等等規則一樣。無論如何,今天早上我發現了什麼事情,並且跟着我的問題回答了希望在2023年的某個時間內,Google Goles將會出現同樣的問題:) – valq

回答

0

嗯,我無法重現這個問題,但我會顯示我做了什麼,所以你可以看到。 我使用SBCL,quicklisp(讓CL的OpenGL),並運行以下

CL-USER> (ql:quickload :cl-opengl) 
To load "cl-opengl": 
    Load 1 ASDF system: 
    cl-opengl 
; Loading "cl-opengl" 
.... 
(:CL-OPENGL) 
CL-USER> (ql:quickload :cl-glut) 
To load "cl-glut": 
    Load 1 ASDF system: 
    cl-glut 
; Loading "cl-glut" 
(:CL-GLUT) 
CL-USER> (defclass smooth-window (glut:window) 
      () 
      (:default-initargs :width 500 :height 500 :pos-x 100 :pos-y 100 
           :mode '(:single :rgb) :title "smooth.lisp")) 
#<STANDARD-CLASS SMOOTH-WINDOW> 

CL-USER> (defmethod glut:idle ((w smooth-window)) 
      (sleep 2) 
      (gl:matrix-mode :modelview) 
      (format t "~%~%(~{~5,3f~^ ~})" (coerce (gl:get-float :modelview-matrix) 'list)) 
      (gl:rotate 10 1.0 0.0 0.0) 
      (format t "~%~%(~{~5,3f~^ ~})" (coerce (gl:get-float :modelview-matrix) 'list))) 
STYLE-WARNING: 
    redefining CL-GLUT:IDLE (#<STANDARD-CLASS SMOOTH-WINDOW>) in DEFMETHOD 
#<STANDARD-METHOD CL-GLUT:IDLE (SMOOTH-WINDOW) {1005CB9363}> 
CL-USER> (glut:display-window (make-instance 'smooth-window)) 


(1.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.985 0.174 0.000 0.000 -.174 0.985 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.985 0.174 0.000 0.000 -.174 0.985 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.940 0.342 0.000 0.000 -.342 0.940 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.940 0.342 0.000 0.000 -.342 0.940 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.866 0.500 0.000 0.000 -.500 0.866 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.866 0.500 0.000 0.000 -.500 0.866 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.766 0.643 0.000 0.000 -.643 0.766 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.766 0.643 0.000 0.000 -.643 0.766 0.000 0.000 0.000 0.000 1.000) 

(1.000 0.000 0.000 0.000 0.000 0.643 0.766 0.000 0.000 -.766 0.643 0.000 0.000 0.000 0.000 1.000) 
; No value 

如果這個簡單的例子工程,則必須存在的東西了與(GL:旋轉腐0.0 0.0 1.0)...我有沒有機會撤消輪換,以便迴歸身份?

對不起,我不能更準確,希望別人可以填寫我錯過的位。快樂的Lisping!

2

我發現,我竟然不好意思,我張貼了關於數額是多少,我的一個非常愚蠢的監督這個大牆的文字問題。但也許闡明問題出聲進言,像我一樣,終於幫我的大腦理出一夜的睡眠之後,下一步第二天早上什麼。

所以發生了什麼事:有人返回單位矩陣,因爲我已經忘記我了,幾個月前,所謂的更廣泛的機箱中的應用,相機-GL功能的其他地方,我在另一個文件中,它是代碼構造的顯示列表中,與所述旋轉和平移顯示列表本身的一部分(即聽起來不可思議的任何人的情況下,遊戲是具有逐步移動的遊戲,不同於飛行模擬或FPS)。

在顯示列表構造塊中,OpenGL命令不會立即執行。

我重新安排在其他文件中的代碼只是調用應用相機-GL任何顯示列表構造的外殼之外......而現在它得到預期的矩陣,因爲平移和旋轉立即得到所謂的被替代推遲到每當(gl:call-list ...)發生時。從現在開始,我將使用專門用於幾何的顯示列表 - 或者更好的是,完全停止使用它們並使用VBO來繪製幾何圖形。

這也解釋了爲什麼它返回項目中其他地方的身份矩陣我把它放在apply-camera-gl以外 - 他們都碰巧在我沒有意識到的顯示列表構建塊昨晚(這個故事的寓意:「隧道視野」是一個真實的東西)

我道歉,這個問題或許可以被關閉。

+0

發現並感謝您對問題進行了詳細的介紹。像這樣記錄邊緣情況是使這些網站如此強大的原因。順便說一句,祝你好運! – Baggers