OpenGl 未找到glGenBuffers ?
win8 + codeblocks + glut3.7
學習紅寶書的時候 提示未找到glGenBuffers是我OpenGl版本問題嗎 怎麼解決
首先沒有誰傻叉的問題,也沒有什麼Windows只支持1.2的問題,這些都是錯誤的認識……說得好像Win用戶就這輩子接觸不到GL3和GL4似的,其實大家不都用得熱火朝天的么。
OpenGL採用的是名為ICD(Installable Client Driver)的機制,簡單來說,就是opengl32.dll只是為你提供了統一的API介面,以及擴展這些介面的可能性。它被載入後將會嘗試去調用更底層的ICD驅動程序,從而完成具體的圖形操作。而這些負責具體實現的底層驅動程序,以及針對不同顯示設備所實現的不同的擴展功能,則是由顯卡驅動廠商提供的——這也就是N粉和A粉和核芯經常爭吵的一個根源之一:ICD驅動程序完全負責底層圖形流水線的操作,那麼出於對API標準的理解不同,對圖形指令的優化不同,開發者的水準不同,以及某些可能無法告人的目的。。。不同的設備驅動廠商對同一個指令的執行結果可能是不一致的,而OpenGL的標準管理者,也就是Khronos,在這裡通常只能起到一個和稀泥的作用。而這些都是苦逼上層開發者無法控制的因素,只能想盡辦法去測試和避免。
至於GLEW這樣的庫,它又做了什麼神奇的事情呢?其實也很好理解。根據OpenGL的標準說明,從動態庫中去請求對應的函數介面。如果能夠得到,那麼這個函數通常是被當前驅動所支持的;否則的話,說明無法支持——這一過程中完全根據自己的需要去獲取函數介面也是完全可行的,只是GLEW或者GLloader for KlayGE這樣的庫幫你方便地完成所有介面的查詢和獲取而已。這也就是我們只需要更新自己的顯卡驅動就可以用到OpenGL的更新特性,而不用去費力找什麼OpenGL SDK的原因。因為 opengl 的介面方式,決定了只有一小部分,比較傳統古老的 api 是直接從 opengl32.dll 導出的。後來的很多 extension,都不是直接導出的,而是需要」動態獲取「。
(備註:提到」動態載入「這個屬於,通常對應的是 LoadLibrary /GetProcAddress / FreeLibrary,然而很顯然,這只是把」客戶程序到 dll 的綁定「延遲到運行期,也就是說客戶程序編譯時,不需要 .lib 也不寫導入表,depends 這樣的程序是無法獲知其動態載入的 dll 依賴的,但是 dll 本身依然是有一個靜態導出表的,所以這裡我沒有使用動態載入這個術語,而是用動態獲取,以示兩者是有區別的)。
所以這就決定了,大部分現代的 api 函數,是需要這樣的一個」動態獲取「,然後才能使用的過程。這和一般的 dll 拿來.h 文件就可以直接用是不同的。
當然,我們可以很容易理解,這是因為各個顯卡提供的能力不同,驅動只能支持 opengl 的一個」功能子集「,也就是說,你的顯卡和驅動程序,提供了一部分能力。這部分能力,取決於顯卡硬體和驅動程序軟體,只能運行時諮詢所在環境,所以 opengl 也不合適靜態鏈接(綁定),而是採用動態鏈接(綁定)。採用這種 api 提供方式,opengl 就可以採用一個統一的形式,應對不同的實際運行環境。
但是由於這些現代 api 數量很大,如果你不使用其他輔助的庫,那麼你必須手工動態獲取(創建 rc,然後查詢你想要使用的 api 的入口點),這過程實在是令人感到非常枯燥和乏味和十分痛苦,所以 opengl 都會推薦給你一些輔助你完成這個 」獲取「 過程的第三方庫。這些推薦可以在 opengl 的官網看到。
比如說,glew 就是一個比較合適的庫。你只需要在 創建了一個 rc 後,再調用 glewInit ,所有的受支持的 api,你就可以以類似靜態鏈接那種方式直接的在代碼里進行調用了。
關於這個話題,opengl 官網上的下面的鏈接,做了很好的介紹:
Load OpenGL Functions如果你想要手動獲取,你可以文中提到的頭文件,這些頭文件已經為你定義好了函數指針的 typedef。類型名字形如:PFN___xxx___PROC;
然後你需要(windows platform)//Create a RenderContext and make it current;
...
PFNxxxPROC fn_xxx = (PFNxxxPROC) wglGetProcAddress("xxx");
fn_xxx( ... );
opengl 有這樣一個特性,只有你切入一個 rc 時,它的實際功能才會對你開啟,所以在 opengl 中為了開啟 opengl 的介面,第一件事總是去創建一個 rc。
試著用glew用上opengl最新特性 應該就找得到了 and 推薦用glfw替代glut
請學習一下opengl的擴展機制
推薦閱讀:
※g++中數組和vector元素個數最多只能是2^31 -1個嗎?
※C++局部靜態變數的內存什麼時候創建的?
※為什麼 C++ 有指針了還要引用?
※c++中在局部空間用new運算符創建的變數是否會被銷毀?
※怎麼用好《C++ Primer》(英文版)?