OpenGL的一些基礎概念

2022-01-20 22:22:27 字數 1778 閱讀 1610

一、什麼是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;

特別注意:基元型別

使用opengl時,建議使用opengl定義的基元型別。比如使用float時我們加上字首gl(因此寫作glfloat)。int、uint、char、bool等等也類似。opengl定義的這些gl基元型別的記憶體布局是與平台無關的,而int等基元型別在不同作業系統上可能有不同                 的記憶體布局。使用gl基元型別可以保證你的程式在不同的平台上工作一致。

當我們使用乙個物件時,大致如下:

1

//opengl的狀態

2struct

opengl_context ;

opengl常見的工作流:

1

//建立物件

2 gluint objectid = 0

; 3 glgenobject(1, &objectid); 45

//繫結物件至上下文

6glbindobject(gl_window_target, objectid); 78

//設定當前繫結到 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狀態的操作的時候,只需要繫結含有需要的設定的物件即可。

openGL一些概念01

頂點資料 頂點資料是一系列頂點的集合。乙個頂點 vertex 是乙個3d座標的資料的集合。而頂點資料是用頂點屬性 vertex attribute 表示的,它可以包含任何我們想用的資料。但是簡單起見,我們還是假定每個頂點只有乙個3d位置和一些顏色值組成的。圖元 為了讓opengl知道我們的座標和顏色...

openGL一些概念02

著色器程式 著色器程式物件 shader program object 是多個著色器合併之後並最終鏈結完成的版本。如果要使用剛才編譯的著色器我們必須把他們鏈結為乙個著色器程式物件,然後在渲染物件的時候啟用這個著色器程式。已啟用著色器程式的著色器將在我們傳送渲染呼叫的時候被使用。當鏈結著色器至乙個程式...

OpenGL基礎概念(一)

頂點 vertexs 圖元 primitives 片元 fragments片斷 畫素 pixels 階段1.頂點 圖元 幾何頂點被組合為圖元 點,線段或多邊形 然後圖元被合成片元,最後片元被轉換為幀快取中的象素數據。階段2.圖元 片元 圖元被分幾步轉換為片元 圖元被適當的裁剪,顏色和紋理資料也相應作...