對於獲取模型視圖矩陣,我似乎在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調用之前,對一些模糊的懷疑也許只是可能,某些事情正在發生故障。但這些添加沒有效果。
是否這樣:http://www.opengl.org/discussion_boards/showthread.php/142432-why-does-glGetFloatv(GL_MODELVIEW_MATRIX)-return-Identity-matrix help? – Baggers
@Baggers那是2001年的主題本來我提到與結束「沒關係,發現它,我不會和任何人我沒有修復它笑XD共享」的結論。我希望技術支持論壇有規則反對這種事情,就像他們強調反對拖釣,火焰傷害,種族主義等等規則一樣。無論如何,今天早上我發現了什麼事情,並且跟着我的問題回答了希望在2023年的某個時間內,Google Goles將會出現同樣的問題:) – valq