OpenGL筆記-2.管線基本流程和各單元介紹

OpenGL中的管線並不是一個具體的操作,而是一系列的串行操作,大約分爲兩個部分:客戶端和服務端,並且這兩個部位是相互獨立的,不僅是在代碼和軟件層面,即使是在硬件層面也是相互獨立的

管線基本流程:

管線又細分爲固定管線和可編程管線,固定管線則只提供函數調用,內部不需要管,但可編程管線則需要理解下內部的工作了,下圖就是一個可編程管線的基本流程

如圖所示,上層爲客戶端,下層爲服務端最上層是自己寫的代碼,然後是OpenGL提供的API,需要注意的是調用服務層的是OpenGL的API並非自己寫的代碼

一般來說客戶端往服務端傳入的數據是三類Attributes(屬性),Uniforms(強行翻譯的話屬於渲染標準),Textrue Data(紋理數據),然後進入頂點着色器,也就是圖中的Vertex Shader,然後處理各個頂點(比如各個頂點在屏幕的位置等等,因爲一般傳入的並不是一個實際值,還有可能會有位移,光影等等),也可以加一堆着色器來深度處理,然後數據進行圖元合層(所謂的圖元合成就是把各種頂點繪製成點線或者三角,然後形成圖形),然後到片元着色器,然後渲染出所得的圖形,需要注意的是Attributes無法直接給片元着色器,只能通過處理得到,而另外兩個數據是完全可以直接給片元着色器的,三個數據並不是都需要的,比如着色不用特殊的紋理,則紋理數據就不用傳了

屬性包括的內容,比如頂點的位置,甚至也可以傳顏色光影的法線等等,但很重要的是,屬性只能給頂點着色器

Uniforms(統計標準),Uniforms是不讓修改的,有點類似於宏定義,可以使用很多次,但不讓改,Unifroms一般是一個批次的圖元處理命令,Uniforms可以直接給片元着色器傳遞值,比如不需要頂點處理的數據等等

紋理數據,頂點着色器主要處理的是座標,偏數字型的數據,而不管是什麼紋理,所以紋理數據一般都是給片元着色器的

可編程管線的可編程內容就是頂點着色器和片元着色器

着色器

 着色器有很多很多種,一般主要的是頂點和片元,這兩個是必須的,另外還有8個是相對用的勤快的,剩下的就更冷門了,頂點和片元就不贅述了

雖然用N種着色器但使用卻是沒有什麼太大區別

GLShaderManager shaderManager; //聲明一個着色器

shaderManager.InitializeStockShaders(); //初始化一個着色器

shaderManager.UseStockShader(各種參數); //區別只在這裏根據不同的着色器這裏傳入的參數也不一樣

單元着色器  一般來說純色就會用單元着色器,其參數值爲GLT_ATTRIBUTE_VERTEX,也只能再傳入一個顏色

平面着色器 一般來說放入一個圖形需要變化則用平面着色器,具體的在後面詳細補充,其參數是GLT_SHADER_FLAT,可以傳入一個4*4的變化矩陣

上色着色器 在頂點着色器之後加入這個會填充顏色到對應的比如線的顏色,比如頂點處理過後的圖形內部的填充顏色等等

默認光源着色器  一個3D更逼真,就需要各種光源,一個光源就會沒那麼立體,但如果有多個光源就會很立體了,但如果只有一個光源的話就會用這個,參數是GLT_SHADER_DEFAULT_LIGHT

點光源着色器 3D必備,自己設置位置,這樣就很立體 參數是:GLT_SHADER_DEFAULT_LIGHT_DIEF

紋理替換矩陣 就是把純色改變成豹紋啊什麼的,畢竟單一顏色沒啥意思,來點豹紋會添加點樂趣 參數是GLT_SHADER_TEXTURE_REPLACE

紋理調整着色器 適合口味比較重的朋友了,如果又想有狂野的味道,又喜歡比較單調的顏色就用這個,可以設置混合值 參數是:GLT_SHADER_TEXTURE_MODULATE

紋理光源着色器 把上面的全部混合起來,幾乎所有參數都可以傳,超高度定製化了參數是GLT_SHADER_TEXTURE_POINT_LIGHT_DIEF

即圖片單元是所有圖形的最小單元,之前說過只有點,線和三角形,點不說了,線在3D下可以是個3D的線環,三角形則能構成很多2D3D的圖形

點 點設置大小的唯一方式就是gl_PoingSize = xx.f,然後就是座標位置還有各種着色器去上色

線 線也沒啥好說的兩個或者多個座標(多個點叫線帶),如果再閉合就是線環,如果座標和寬度設置到位,線環其實就像個戒指,然後線的寬度glLineWidth(xx.f)也是唯一的修改辦法

三角形 三角形有且只能有三個頂點,多的話會變成單獨的點線或者三角,而很多模型都是多個三角形拼湊的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章