[翻譯]opengl擴展教程1

[翻譯]opengl擴展教程1

原文地址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_nameVENDOR(廠商)來自但不限於下表。翻譯

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入門

我要使用GLEW,沒有任何理由————Glee是同樣好。最新版本的 GLEW 是 1.3.5 並支持 OpenGL 2.1 核心功能和其餘一些新的擴展。

入門簡介

能夠把GLEW編譯成靜態庫或者動態庫。若是編譯爲靜態庫,請確保頂一個預處理的變量GLEW_STATIC(在Windows下)。另外一種方式是直接把glew.cglew.h文件複製到你的代碼中(若是在windows下,也必須定義GLEW_STATIC)。這是我首選的方式,由於它使得跨平臺編譯和管理變得更簡單。

你能夠在這裏下載個人GLEW+FreeGLUT的簡單示例工程:
下載:OpenGL_Extensions_Tutorial.zip (GLEW和FreeGLUT以及包含在內)

它是一個Virtual Studio 7.1工程。它能夠轉換到8.0(速成版或更高)
(若是你建立一個不一樣平臺[或編譯器]的工程[或Makefile],請發送到christen@clockworkcoders.com,我將把它放在這裏)

初始化GLEW

GLEW須要初始化。當你進行初始化的時候,必須具備有效可用的OpenGL渲染上下文。(在大多數狀況下這意味着一個OpenGL窗口必須存在和激活)。

GLenum err = glewInit();
if (GLEW_OK != err)
{
  // failed to initialize GLEW!
}
std::cout "Using GLEW Version: " glewGetString(GLEW_VERSION);

檢測OpenGL版本

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宏檢測平臺特定的擴展。或使用數wglewIsSupportedglxglewIsSupported)。要使用平臺特定擴展,須要在inlcude 「glew.h」以後include 「wglew.h」或」glxglew.h」。

if (WGLEW_ARB_pbuffer)
{ 
  ... 
}

練習

  1. 編寫一個程序,它會檢測您的計算機上安裝的OpenGL核心版本並打印結果到控制檯。(使用GLEWGlee爲此!)
  2. 獲取glGetString(GL_EXTENSIONS)返回的字符串最大長度?
相關文章
相關標籤/搜索