原文地址https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/extensions.phpphp
OpenGL
擴展是爲了使用3D圖形硬件的新功能。硬件廠商定義新的函數到OpenGL來支持新的或加強已有的特性。c++
由單個廠商建立的擴展是"vendor-specific"
(廠商特定),有多個廠商共同學口的擴展是"multivendor"
(多廠商)。windows
若是"vendor-specific"
或"multivendor"
擴展證實是一個好的加強功能,那麼OpenGL Architecture Review Board
(ARB是OpenGL管理機構的簡稱)也許會推動它成爲一個"ARB approved"
(ABR承認)擴展。app
若是這個擴展是很是好的,那麼ABR
也許會將其整合到OpenGL的"core feature"
(核心特徵)。一個很是好的例子就是"OpenGL Shading Language"
(OpenGL着色器語言)如今已是OpenGL2.0或更高版本的」core feature」的一部分。函數
這個理念使得OpenGL變得很是強大,由於源代碼保持向後兼容,10年前編寫的OpenGL程序,如今還能夠工做。.net
在一個有效的OpenGL上下文環境中,你可使用glGetString(GL_EXTENSIONS)
來獲取一個包含全部可用擴展的列表,它返回一個以空格分隔的長字符串。
全部的擴展形式:GL_VENDOR_extension_name
,VENDOR
(廠商)來自但不限於下表。翻譯
VENDOR | 描述 |
---|---|
ARB | ABR承認的擴展 |
EXT | 多廠商擴展 |
APPLE | 蘋果計算機公司的擴展 |
ATI | ATI(AMD)科技公司的擴展 |
HP | 惠普公司的擴展 |
NV | NVIDIA的擴展 |
SGIS | Silicon Graphics的擴展 |
也有一些前綴不是GL
的擴展,它們是特定平臺的。最著名的就是WGL
前綴的,它們是Windows平臺特定的擴展。以及GLX
前綴的,它們是X-Window平臺特定擴展。指針
在C++代碼中使用擴展是-不幸的-是特定於平臺。函數 (函數指針) 的地址,必須從OpenGL執行 (例如硬件驅動程序)中檢索。在Windows下這可使用wglGetProcAddress
來檢索。code
本行非原文翻譯這裏說一下,OpenGL的一些新增函數,每每不是直接使用源代碼或者靜態庫連接到程序中去的,而是在程序運行的時候動態獲取函數的指針,來調用函數的。本行非原文翻譯教程
爲了節省在多個平臺處理全部函數指針和令牌的全部擴展的大量的時間,有一些好開源解決方案可用於簡化此過程。其中之一是GLEW
,可在http://glew.sourceforge.net。另外一個實現是Glee
,可在http://elf-stone.com/glee.php。都是好的處理擴展和修改的方法來,它們在BSD許可證下發布。(請務必閱讀許可證的詳細信息)。
我要使用GLEW
,沒有任何理由————Glee是同樣好。最新版本的 GLEW 是 1.3.5 並支持 OpenGL 2.1 核心功能和其餘一些新的擴展。
能夠把GLEW編譯成靜態庫或者動態庫。若是編譯爲靜態庫,請確保頂一個預處理的變量GLEW_STATIC
(在Windows下)。另外一種方式是直接把glew.c
和glew.h
文件複製到你的代碼中(若是在windows下,也必須定義GLEW_STATIC
)。這是我首選的方式,由於它使得跨平臺編譯和管理變得更簡單。
你能夠在這裏下載個人GLEW+FreeGLUT的簡單示例工程:
下載:OpenGL_Extensions_Tutorial.zip (GLEW和FreeGLUT以及包含在內)
它是一個Virtual Studio 7.1工程。它能夠轉換到8.0(速成版或更高)
(若是你建立一個不一樣平臺[或編譯器]的工程[或Makefile],請發送到christen@clockworkcoders.com,我將把它放在這裏)
GLEW
須要初始化。當你進行初始化的時候,必須具備有效可用的OpenGL
渲染上下文。(在大多數狀況下這意味着一個OpenGL窗口必須存在和激活)。
GLenum err = glewInit(); if (GLEW_OK != err) { // failed to initialize GLEW! } std::cout "Using GLEW Version: " glewGetString(GLEW_VERSION);
GLEW
容許檢查 若是某些OpenGL
版本 (1.一、1.二、1.三、1.五、2.0、2.1)的全部核心擴展是否可用。若是你有安裝OpenGL 1.3
,那麼 OpenGL 1.2和1.1的核心擴展也會檢測。
if (GLEW_VERSION_1_5) { std::cout "Core extensions of OpenGL 1.1 to 1.5 are available!\n"; }
有兩種方式來檢測一個擴展是否支持:使用GLEW宏
–一個較慢的方式–使用名稱字符串
GLEW宏方式
if (GLEW_ARB_vertex_program) { ... }
glewIsSupported函數方式
if (glewIsSupported("GL_ARB_vertex_program")) { ... }
此外可使用GLEW
宏檢測平臺特定的擴展。或使用數wglewIsSupported
或glxglewIsSupported
)。要使用平臺特定擴展,須要在inlcude 「glew.h」以後include 「wglew.h」或」glxglew.h」。
if (WGLEW_ARB_pbuffer) { ... }
OpenGL
核心版本並打印結果到控制檯。(使用GLEW
或Glee
爲此!)