1. 程式人生 > 實用技巧 >OpenGL的一些基礎概念

OpenGL的一些基礎概念

一、什麼是OpenGL      OpenGL是一個圖形API,包含了一系列的可以操作圖形、影象的函式。它並不是一個獨立的平臺,需要使用一個程式語言來工作,最常見的就是使用C++。然而,更嚴格的定義來講,OpenGL應該是指一套規範。 二、OpenGL的一些基礎概念 1、核心模式與立即渲染模式   早期的OpenGL使用的是立即渲染模式(固定渲染管線),OpenGL的大多數功能都被庫隱藏起來,基於OpenGL的開發者很難去控制計算的自由。雖然在立即渲染模式下,圖形的繪製很方便。 但是從3.2版本開始,就開始廢棄立即渲染模式了,推出了核心模式,這個模式完全移除了舊的特性。   當使用OpenGL的核心模式時,OpenGL迫使開發者去使用現代函式。雖有難度,但更靈活,效率更高,更重要的是可以更深入的理解圖形程式設計。 2、擴充套件
  OpenGL的一個比較重要的特性就是對擴充套件的支援。 當一個顯示卡公司提出一個新特性或者渲染上的大優化,通常會以擴充套件的方式在驅動中實現。 3、狀態機   OpenGL本身就是一個巨大的狀態機:一系列的變數描述此時的OpenGL如何執行。其狀態通常被稱為上下文(context)。一般使用設定選項、操作緩衝來更改OpenGL的狀態。最後使用當前的OpenGL上下文來渲染。 4、物件   OpenGL是用C語言編寫的,同時支援多語言的派生,但核心仍然是C庫。由於C語言不容易被翻譯到其它高階語言,因此OpenGL開發過程中,引入了一個抽象層。“物件”就是其中一個。在OpenGL中的物件指的是一些選項的集合,代表OpenGL狀態的一個子集。可以把物件看作是一個C風格的結構體(struct),如下程式碼塊所示:
1
struct object_name{ 2 GLfloat option1; 3 GLuint option2; 4 GLchar[] name; 5 };
  特別注意:基元型別   使用OpenGL時,建議使用OpenGL定義的基元型別。比如使用float時我們加上字首GL(因此寫作GLfloat)。int、uint、char、bool等等也類似。OpenGL定義的這些GL基元型別的記憶體佈局是與平臺無關的,而int等基元型別在不同作業系統上可能有不同 的記憶體佈局。使用GL基元型別可以保證你的程式在不同的平臺上工作一致。   當我們使用一個物件時,大致如下:
1
// OpenGL的狀態 2 struct OpenGL_Context { 3 ... 4 object* object_Window_Target; 5 ... 6 };

  OpenGL常見的工作流:
 1 // 建立物件 
 2 GLuint objectId = 0; 
 3 glGenObject(1, &objectId); 
 4  
 5 // 繫結物件至上下文 
 6 glBindObject(GL_WINDOW_TARGET, objectId); 
 7  
 8 // 設定當前繫結到 GL_WINDOW_TARGET 的物件的一些選項 
 9 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); 
10 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); 
11  
12 // 將上下文物件設回預設 
13 glBindObject(GL_WINDOW_TARGET, 0);

  使用物件的一個好處就是,在程式中不止可以定義一個物件,並設定它們的選項,每個物件都可以是不同的選項。 執行一個使用OpenGL狀態的操作的時候,只需要繫結含有需要的設定的物件即可。