OpenGL(一)入門簡介

OpenGL(一)入門簡介

什麼是OpenGL

OpenGL(Open Graphics Library, 開放式圖形庫)。我們常用的平時使用的庫包括:

  1. gl:核心庫;以gl開頭,包含了最基本的3D函數。
  2. glu: 實用庫;對gl的部分封裝,起輔助作用;如果算數好,不用glu的情況下,也是可以做出同樣的效果;以glu開頭,包含紋理、座標、基本形狀等;
  3. glaux: 輔助庫;包含窗口、輸入輸出、基本形狀;
  4. glut: (OpenGL Utility Toolkit)實用工具庫,替代(aux);基本的窗口界面,獨立於gl和glu;以glut開頭,包括窗口、輸入輸出、字體、圖像等。
  5. freegult:glut的一個開源版本;
  6. glfw: 實用工具庫,輕量級跨平臺攻庫,提供了一些渲染物體所需的最低限度接口;管理窗口、讀取輸入、處理事件;
  7. glew:
  • 跨平臺的openglC++拓展庫;
  • 自動識別平臺所支持的opengl高級拓展函數;
  • 包含glew.h頭文件,就能實用gl, glu, glext, wgl,glx的全部函數。
  1. 窗口庫:
  • gl: OpenGL的X窗口系統拓展(如Ubuntu等帶界面的linux系統);

  • agl: OpenGL的apple窗口拓展;

  • wgl: openGL的windows窗口拓展;
    一般常用的組合: freeglut + glew 和 glfw + glew。大牛當然也可只用核心庫從頭開始。

    上面總結了大家在在基於OpenGL開發時常用的庫。從這點看,很多人都會認爲是在面向接口編程,以爲OpenGL是一個API(Application Programming Interface, 應用程序編程接口)。其實不然,它以兩種形式存在:

  • 第一種形式,它僅僅是一個由Khronos制定定並維護規範(Specification)。所有版本的OpenGL規範文檔都被公開的寄存在Khronos那裏這是OpenGL3.3的規範。它只是定義了OpenGL API以及OpenGL 整個狀態機

  • 第二種形式, OpenGL的實現。開發人員根據OpenGL的規範,實現我們現在使用庫裏的功能。而這些實現一般由顯卡開發商提供。如果你使用的某個函數功能,卻沒有實現應有的效果,在參數設置無誤的情況下,那就是顯卡產商提供的實現有bug,這時可以通過更新電腦的顯卡驅動,看是否能解決這個問題。

OpenGL拓展(Extension)機制

既然OpenGL的第二種形式是依靠各大顯卡產商根據OpenGL實現,而且各大硬件廠商在市場上競爭如此激烈,那麼硬件提供商在圖形方法學以及特效方面必須擁有持久的創新力的。因此,OpenGL允許硬件廠商通過它的拓展機制進行創新。那我們在使用OpenGL新特性或者渲染上的大優化功能時,就需要通過查詢當前顯卡是否支持。

/*查詢當前支持多少拓展*/
GLint nNumExtension;
glGetIntegerv(GL_NUM_EXTENSIONS, &nNumExtension;)

for(int i = 0; i < nNumExtension; i++)
{
    /*是否支持windows上交換拓展*/
    if(strcmp("WGL_EXT_swp_control", (const char*)glGetString(GL_EXTENSIONS, i)) == 0
    {
        /*實現拓展的內容*/
    }
}

OpenGL渲染模式

  1. 立即渲染模式(Immediate mode),也稱固定渲染線管。固定渲染線管,它的特點是容易使用,而且非常方便。因爲固定線管把很多功能都隱藏起來,開發者可以不用去理會很多細節的地方。但是在便利背後,卻有着無法掌控細節,性能得不到優化等缺點。OpenGL3.2開始分成了核心框架和完整框架,核心框架移除了任何老舊特性,
  2. 核心框架模式,可以讓我們知道OpenGL是如何運作的,理解圖形編程。並且提供很多靈活高效的的圖形編程。在覈心框架中,無論我們實現什麼,都需要編寫一個着色器。這樣處理起來雖然比固定線管麻煩一些,但收益是可觀的。
    因此,後面幾何都會使用OpenGL核心框架模式,也就是OpenGL3.2以上版本。

OpenGL 狀態機

OpenGL使用了一種狀態模型(或者稱爲狀態機[State Machine])來追蹤所有OpenGL的狀態變量。另外,OpenGL的狀態通常被稱爲OpenGL上下文(Context)。可以簡單理解爲大部分狀態都是一些開關,如深度測試狀態,要麼打開,要麼關閉(但也不是所有狀態都是打開關閉)。
具體使用,當一個狀態值被設置後,它就一直保持這個狀態,這時我們當前的OpenGL上下文(Context)進行渲染,渲染完成後再關閉這個狀態。
舉例:

/*開光狀態*/
void glEnable(GLenum capability);
void glDisable(GLenum capability)

/*設置變量值*/
void glGetBooleanv(GLenum pname, GLbool *parama);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章