openGL管線各環節細節

2022-04-02 04:22:41 字數 3659 閱讀 1950

固定程式設計管線圖:

被著色器替代的部分:

一、記憶體開始

1、一次乙個頂點:    glbegin     頂點     法線     顏色     紋理     ...    glend   

2、頂點陣列:gldrayarrays   

3、顯示列表:glnewlist glendlist   

4、快取區物件:glbufferdata    

二、各頂點操作

1、各頂點會通過模型矩陣和投影矩陣來轉換。   

2、法線會通過從模型矩陣獲得的左上角的3x3矩陣的逆變換來轉換。  

3、紋理座標會通過紋理矩陣來轉換。   

4、光照演算法會得到應用以修改基色。  

5、可能會自動生成紋理座標、應用顏色材質狀態以及計算點的大小。   這個階段最主要的操作是轉換與光照。   

三、圖元組裝

這個階段頂點會合成完成的圖元。將圖元傳遞到下乙個階段。   

四、圖元處理

1、裁剪   

2、透視投影(視口變換以生成視窗座標)。  

3、消隱culling操作,如背面剔除。    

五、柵格化

1、圖元將被分解成更小的單元,這些單元對應目標幀快取區中的畫素(片元)。   

2、走樣化處理,使圖元消除鋸齒變的更加平滑。   

六、片元處理

1、上紋理。會訪問紋理記憶體。   

2、霧化。根據片元距離當前視點的位置修改其顏色。   

3、顏色彙總。將片元的主顏色與次(第二)顏色的值整合在一起。   

七、逐個片元的操作

1、畫素所有權測試。確定目標畫素是可見的還是被乙個重疊的視窗蓋住呢。   

2、剪下測試。根據通過呼叫glscissor建立的乙個矩形區域來裁剪片元。   

3、alpha測試。根據片元的alpha值和通過呼叫glalphafunc建立的函式來確定是否丟棄片元。  

4、混合。根據片元的顏色以及儲存在幀快取區的顏色通過混合狀態(由glblendfunc、glblendcolor    和glblendequation設定)來確定要寫入幀快取區的的顏色。   

5、抖動。允許一種只有少量離散顏色的顯示系統模擬出更寬的顏色範圍。可以大幅度改善低端顏色系    統的顯示效果。預設是開啟的,會影響效能。可以gldisable(gl_dither)關閉。

6、邏輯操作。使用通過gllogicop建立的邏輯操作將最終的片元值與幀快取區中的值結合起來。   

八、幀快取區操作

1、gldrawbuffer指定之後渲染操作的目標。opengl支援顯示立體影象以及雙重快取區,因此對於渲染的目標有多個選擇。    

幀快取區的各個區域被稱為快取區buffers,分別為前、後、左、右、前左、前右、後左、後右以及前後。   

2、glcolormask。該函式決定是否允許對目標快取區的顏色分值r、g、b和a部分執行寫入操作。   

3、gldepthmask。決定是否可以修改目標快取區的深度部分。   

4、glstencilmask。控制了對目標快取區的模板部分中的特定為的寫入操作。   

5、glaccum。指定積聚快取區操作。   

6、glclear。初始化幀快取區的值。分別呼叫glclearcolor、glcleardepth、glclearstencil和glclearaccum設定來初始    化顏色部分、深度部分、模板部分和積聚快取區的值。    

7、glflush。 為了確保乙個特定渲染環境的全部圖元是逐漸完成的。   

8、glfinish。為了確保乙個特定渲染環境的全部圖元是完成了渲染。這個命令會一直阻塞到之前所有的命令的效果已全部    完成為止。就效能而言,這樣做的代價是昂貴的,需謹慎使用。   ↓↓

九、繪製影象

1、gldrawpixels。將影象資料渲染到幀快取區。

2、glbitmap。將位圖渲染到幀快取區中。

3、glteximage、gltexsubimage。將影象渲染到紋理記憶體中。  

4、畫素解碼。glpixelstore指定那些定義了如何在記憶體中儲存影象資料的引數。從應用程式記憶體中讀取的畫素通過畫素解碼後轉換成乙個連貫的畫素流。

通過gldrawpixel這樣的呼叫將影象傳輸到opengl時,這個操作會應用當前的一組畫素解碼引數來確定如何讀取和解析畫素影象。

從記憶體中讀取各個畫素時,畫素會被轉換為乙個其中包含了顏色、深度和模板值的畫素組。

5、畫素傳輸。無論何時將影象從應用程式傳輸到opengl(gldrawpixels、glbitmap、glteximage、gltexsubimage),或者從opengl傳回應用程式(glreadpixels),

或者從opengl內部使用它們(glcopypixels、glcopyteximage、glcopytexsubimage),都會應用畫素傳輸。

glpixeltransfer。修改傳輸階段的行為。

6、柵格化和後端處理。通過柵格化畫素矩形(影象)的過程來生成片元。

glrasterpos、glwindowpos。指定當前的光柵位置。

glpixelzoom。當前的縮放因子。

之後又回到上圖中的(6,7,8,9)步驟。↓↓

十、座標轉換

1、模型變換矩陣(model transformation matrix)。它表示從物件座標系到世界座標系的轉換。為了把物件放到世界座標系中的正確位置,通常需要這樣一次模型矩陣變化。

2、檢視矩陣(viewing matrix)。從世界座標系轉換到相機座標系。在構成了場景之後,需要指定檢視引數。其一就是確定相機的位置。經過模型變換矩陣轉換後,將其與該矩陣相乘。之後其座標就會從世界

座標系轉換到相機座標系。相機的位置被定義為座標原點。要注意的是opengl將這兩個矩陣合二為一,稱為模型檢視矩陣(modelview matrix),它用來從物件座標系到相機座標系的轉換。

3、glmatrixmodel:指定當前操作的矩陣、glloadidentity:重置當前矩陣到原點、glloadmatrix:替換當前矩陣、glmultimatirx:乘以當前矩陣、glpushmatrix:將當前矩陣入棧,glpopmatrix:出棧。

4、gllight指定光源時,opengl缺省會使用模型檢視矩陣進行轉換,讓其用相機座標系中表示。因此在指定光源位置之前,必須先設定好模型檢視矩陣。

5、法線到相機座標系的轉換。因為光照計算是發生在相機座標系中,因此需要將表面法線也要轉化到相機座標系中來。這個過程可以通過模型檢視矩陣的逆轉置矩陣來完成。

6、投影轉換。將座標轉換到相機座標空間之後,要做的下一件事就是定義乙個視景。這是三維場景中可以在最終影象中看到的那個區域。glmatrixmodel(gl_projection)設定當前矩陣為投影矩陣,

glortho(正視投影)、glfrustum(透視投影)和gluperspective(更直觀的透視投影)。

opengl渲染管線

學習著色器,並理解著色器的工作機制,就要對opengl的固定功能管線有深入的了解。首先要知道幾個opengl的術語 渲染 rendering 計算機根據模型 model 建立影象的過程。模型 model 根據幾何圖元建立的物體 object 幾何圖元 包括點 直線和多邊形等,它是通過頂點 verte...

opengl渲染管線理論

opengl 渲染管線理論 這幾天稍微看了一些關於glsl的頂點著色以及片元著色的一些相關知識.目前來講還有乙個著色器則是geometry shader.我的顯示卡用不了這個功能.當然有點遺憾 在看了一些之後,大概了解了一些關於opengl渲染管線的知識.看了這個之後對於opengl的學習我想應當是...

OpenGL 渲染管線理論

學習著色器,並理解著色器的工作機制,就要對opengl的固定功能管線有深入的了解。渲染 rendering 計算機根據模型 model 建立影象的過程。模型 model 根據幾何圖元建立的物體 object 幾何圖元 包括點 直線和多邊形等,它是通過頂點 vertex 指定的。最終完成了渲染的影象是...