初識OpenGL4.0 (轉)

 

【OpenGL】初識OpenGL4.0


目錄(?)[+]

這篇文章主要是根據《OpenGL Shading Language Cookbook》一書翻譯整理而得,介紹了環境的安裝和一些基礎知識。下面涉及到的庫也可以到這裏下載(Windows版)。


2014年9月26日更新:

擦!每次弄OpenGL光配置都弄得很頭大。。。由於換了Mac電腦,下面補充了Mac下的注意事項(這時候突然覺得Windows這麼方便。。。)

-----------------------------------------------------------------分割線-------------------------------------------------------------------



什麼是GLSL


GLSL是OpenGL Shading Language的縮寫,顧名思義就是OpenGL渲染語言,它允許我們通過一些接口直接利用現代的圖形處理單元(GPUs)進行圖形繪製等工作。GLSL語言必須協同OpenGL語言纔可以工作。它們嵌入在更龐大的OpenGL語言裏,這些迷你的代碼通常被稱爲shader,它們運行在GPU而不是CPU上。從名字上可以看出來,GLSL大多跟3D圖像的燈光、渲染等工作有關,但它們的能力絕不僅僅如此。它們還可以用於動畫、曲面計算等更深的應用。

Shader語言被設計成可以直接運行在GPU上,並且通常是並行的。例如,對於每個像素,一個fragment shader,片段着色器,可能執行一次,並且是同時在不同的GPU單元上同時執行。顯卡上處理器的數量決定了同時可以允許多少個同時執行。這樣的特性使得shader具有很好的性能,並允許程序員進行並行運算。
現代顯卡的計算能力是讓人印象深刻的,下面的表格顯示了NVIDIA GeForce 400系列顯卡上處理器的數量:

設計者希望Shader程序可以替換傳統OpenGL體系結構中的fixed-function pipeline,固定功能管道,部分。在之前,默認的燈光/陰影計算是這個管道的一個核心部分。但是,但我們想要它們實現更多更高級的功能時,我們就需要做非常的工作來實現,而實際上很多是它們無法做到的。GLSL的出現改變了這樣的境地,它允許我們使用GLSL語言代替以前的“硬編碼”,從而提供了更靈活、更高級的功能。

OpenGL 3.0進入了一個棄用的模型,也就是逐漸被OpenGL規格移除的功能。一些功能和特性可以說是被標誌爲被棄用了,這意味着它們在未來的OpenGL版本里將會被移除。例如,使用glBegin/glEnd的快速模式渲染在OpenGL 3.0中被標爲棄用,在3.1版本里被移除。(我們現在上課還講來着。。。)
而爲了保持向後兼容性,OpenGL 3.2介紹了compatibility profiles,兼容配置文件的概念。如果程序員想要使用特定版本的OpenGL代碼(不需要兼容),就可以使用所謂的core profile。而一些人可能希望可以向後兼容,那麼就可以使用compatibility profiles。

選擇一個a core profile或者a compatibility profile的步驟是跟窗口系統有關的。例如,在最新的Qt版本(現在最新的是5.0)中,我們可以使用下面的代碼來選擇一個 4.0 core profile :
[plain] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. QGLFormat format;  
  2. format.setVersion(4,0);  
  3. format.setProfile(QGLFormat::CoreProfile);  
  4. QGLWidget *myWidget = new QGLWidget(format);  


GLEW


在Windows平臺上OpenGL的版本被固定在1.1,這使得Windows平臺的開發者不能直接訪問最新的OpenGL版本的接口。我們需要進行一系列冗繁的工作來在運行時刻得到一個函數調用的指針,而且還會影響代碼的整潔。而且,Windows自帶的頭文件是遵循OpenGL1.1版本,據稱,Windows也不準備更新自帶的gl.h和opengl32.lib。幸運的是,有人爲我們做了這些事情還提供了相應的庫和接口。GLEW就是其中一個。


安裝GLEW


爲了安裝GLEW,以WIndows平臺爲例,我們可以到http://glew.sourceforge.net下載最新的glew版本,將其中的glew.h和wglew.h文件複製到編譯器的對應文件夾下(例如VS的include文件夾),把glew32.lib文件複製到對應的庫文件夾下(如VS的lib文件夾),以及glew32.dll複製到系統的根目錄下(如system32/下)。

MAC版下的安裝(以Qt爲例):

Mac下沒有現成的編譯好的文件,需要下載源碼然後用makefile。具體可以參見這裏。也就是下面的做法:
  1. 下載 GLEW源碼。
  2. 解壓 GLEW。
  3. 打開命令行窗口,使用"cd"命令進入解壓後的 GLEW 目錄。
  4. 執行"make"命令,編譯 GLEW。(注:要執行 make 命令,必須先確保 XCode 安裝了 Command Line Tools)。
  5. 執行"sudo -s",進入管理員權限。
  6. 執行"make install",將 GLEW 的頭文件和庫文件分別複製到 /usr/include 和 /usr/include/GL 目錄中。
  7. 在 Qt 工程中,右擊項目圖標,在彈出的快捷菜單中選擇"Add Library..."命令。在彈出的嚮導對話框中選擇"External Library",指定 GLEW 庫文件和頭文件的目錄位置,在"Platform"中只勾選"Mac"一項。完成 GLEW 庫的導入。
  8. 在 Qt 工程中,右擊項目圖標,在彈出的快捷菜單中選擇"Add Library..."命令。在彈出的嚮導對話框中選擇"System Library",指定 OpenGL.framework 的目錄位置(在 /System/Library/Frameworks 目錄下),在"Platform"中只勾選"Mac"一項。完成 OpenGL.framework 庫的導入。
  9. 在 Qt 工程中,右擊項目圖標,在彈出的快捷菜單中選擇"Add Library..."命令。在彈出的嚮導對話框中選擇"System Library",指定 QtOpenGL.framework 的目錄位置(在 Qt 安裝目錄的 lib 目錄下),在"Platform"中只勾選"Mac"一項。完成 QtOpenGL.framework 庫的導入。因爲即使不使用 QtOpenGL 庫中的 API,在使用 Qt 窗口框架時,還是會用到 QGLWidget 類的。


使用GLEW


爲了使用glew,請確保在包含OpenGL頭文件之前包含glew.h:
  1. #include <GL/glew.h>  
  2. #include <GL/gl.h>  
  3. #include <GL/glu.h>  

在初始化GL後、調用任何OpenGL代碼前,加入以下代碼:
  1. GLenum err = glewInit();  
  2. if( GLEW_OK != err )  
  3. {  
  4. fprintf(stderr, "Error initializing GLEW: %s\n",  
  5. glewGetErrorString(err) );  
  6. }  


其他庫


另一個管理OpenGL擴展的庫時GLEE,具體信息可見http://www.elf-stone.com/glee.php。它和GLEW類似,但是不需要在運行時刻初始化。


使用GLM庫進行數學運算


在計算機圖形學中,計算是一個核心的功能。以前的OpenGL版本提供了進行座標變換和投影的標準矩陣棧(GL_MODELVIEW and GL_PROJECTION)。在最新的OpenGL 4.0裏,這些功能都被移除了。因此,需要我們自己提供座標和投影變換矩陣,然後將它們傳遞給shader。當然你還是可以自己寫一個庫來管理這些,但是不推薦這樣。
一個類似的庫時Christophe Riccio編寫的GLM。它的設計是基於GLSL規則的,因此它的語法和GLSL語言很相似。同時,它提供了一些OpenGL擴展來彌補缺失的那些OpenGL功能,例如glOrtho,,glRotate, gluLookAt。


安裝GLM

你可以在http://glm.g-truc.net網站下載安裝包,解壓後將glm文件夾複製到編譯器對應的文件夾下(例如VS的include文件)。Mac下要把頭文件放到usr/include下,然後在Qt項目的.pro文件中添加頭文件目錄。


使用GLM

和普通的核心頭文件相似,你可以使用下面的代碼來包含矩陣變換和transform2擴展:
  1. #include <glm/glm.hpp>  
  2. #include <glm/gtc/matrix_transform.hpp>  
  3. #include <glm/gtx/transform2.hpp>  

然後你就可以使用glm命名空間進行編碼了。下面是一個例子:
  1. glm::vec4 position = glm::vec4( 1.0f, 0.0f, 0.0f, 1.0f );  
  2. glm::mat4 view = glm::lookAt( glm::vec3(0.0,0.0,5.0),  
  3. glm::vec3(0.0,0.0,0.0),  
  4. glm::vec3(0.0,1.0,0.0) );  
  5. glm::mat4 model = glm::mat4(1.0f);  
  6. model = glm::rotate( model, 90.0f, glm::vec3(0.0f,1.0f,0.0) );  
  7. glm::mat4 mv = view * model;  
  8. glm::vec4 transformed = mv * position;  

不要使用下面的代碼來引入glm的命名空間:
  1. using namespace glm;  

這通常會引起命名空間的衝突。相反,你應該使用下面的代碼來包含某一個符號:
  1. #include <glm/glm.hpp>  
  2. using glm::vec3;  
  3. using glm::mat4;  



使用GLM作爲OpenGL的輸入


GLM支持使用OpenGL的向量函數(以"v"爲後綴)直接向OpenGL傳遞一個GLM類型(通常是爲了向shader傳遞參數)。例如:
  1. #include <glm/glm.hpp>  
  2. #include <glm/gtc/matrix_transform.hpp>  
  3. ...  
  4. glm::mat4 proj = glm::perspective( viewAngle, aspect,  
  5. nearDist, farDist );  
  6. glUniformMatrix4fv(location, 1, GL_FALSE, &proj[0][0]);  

更多文檔可以詳見http://glm.g-truc.net(需要翻牆)。


使用GLFW進行窗口管理



這裏再介紹一個庫GLFW。在以前的OpenGL版本里我們通常會使用glut來進行窗口的創建、按鍵監聽等工作,但據說這個庫已經很久沒更新了,那麼glfw就是一個可以作爲替代的庫。它是網址是http://www.glfw.org/。安裝方法和上面兩個庫類似。使用方法可以詳見自帶的文檔。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章