學習着色器,并了解着色器的工作機制,就要對OpenGL的固定功能管線有深入的了解。
首先要知道幾個OpenGL的術語
渲染(rendering):計算機根據模型(model)建立圖像的過程。
模型(model):根據幾何圖元建立的物體(object)。
幾何圖元:包括點、直線和多邊形等,它是通過頂點(vertex)指定的。
最終完成了渲染的圖像是由在螢幕上繪制的像素組成的。在記憶體中,和像素有關的資訊(如像素的顔色)組織成位平面的形式,位平面是一塊記憶體區域,儲存了螢幕上每個像素的一個位的資訊。例如,它指定了一個特定像素的顔色中紅色成分的強度。位平面又可以組織成幀緩沖區(framebuffer)的形式,後者儲存了圖形硬體為了控制螢幕上所有像素的顔色和強度所需要的全部資訊。
OpenGL的固定功能管線
理清了基本的概念,下面了解了一些關于OpenGL渲染管線的知識.看了這個之後對于OpenGL的學習我想應當是很有幫助.關于這麼一篇的原文則是GLSL-LIGHTSOURCE 教程一個開篇部分.點選這裡通路原文。原文是英文的,以下是中文的翻譯,點選通路下文的原文位址。
關于渲染管線将什麼呢?無非就是在OpenGL的管道當中各個部分的功能以及如何在管道當中形成了我們想要的最終的一幅圖.(像素).而管線當中的操作可分為以下幾個部分:
階段1. 指定幾何對象.
如:點 線 三角形.等一些幾何圖元..OpenGL繪制幾何圖元的方法有以下三種:
- <1> 一次一個頂點.即使用glBegin() glVertex() glEnd() 指定幾何對象.
- <2> 使用頂點數組..如glDrawArrays.glDrawElements.等.一次性的繪制大量圖元.
上面這兩種模式則是立即模式.即指定完圖元之後會被立即渲染.即将所有資料發往渲染管線後立即被渲染.
- <3>顯示清單模式.它存儲于OpenGL服務端 (接收OpenGL指令的一端),操作函數有 glNewList、 glEndList、 glCallList .
階段2 頂點處理操作:
不管以上的幾何對象是如何指定的,所有的幾何資料都将會經過這個階段,這個階段負責的則是逐個頂點的操作.
在這個階段能做的工作則是:
- 頂點變換:根據模型視圖和投影矩陣變換
- 光照計算和法線變換(法線矩陣 是模型矩陣的左上角3*3的逆矩陣)和法線規格化
- 紋理坐标變換.(紋理矩陣)
- 材質狀态:紋理坐标生成
而最重要的則是變換以及光照. 每個頂點在這個階段分别是單獨處理的.
這個階段所接收到的資料則是每個頂點的屬性特征..輸出則是變換後的頂點資料.
階段3 圖元組裝
在頂點處理之後,頂點的全部屬性都已經被确定。在這個階段頂點将會根據應用程式送往的圖元規則如GL_POINTS 、GL_TRIANGLES 等将會被組裝成圖元。
階段4 圖元處理(裁剪 消隐)
- <1>這個步驟第一個所做的應當是裁剪操作,會将圖元與使用者定義的裁剪平面,即glClipPlane 和模型投影矩陣所建立的視景比較. 這将會裁剪且丢棄位于視景和裁剪平面外部的圖元.不在予以處理.
- <2> 其次.若是采用透視投影 那麼.将會對每個頂點的x,y z坐标分别除以w.
- <3>緊接着,則是由視口變換将頂點坐标變換至視窗坐标.
- <4> 執行消隐操作
階段5 栅格化操作
- <1>由圖元處理傳遞過來的圖中繼資料.在此将會被分解成更小的單元并對應幀緩沖區的各個像素.這些單元被稱之為片元. 一個片元可能包含視窗左邊、深度、顔色、紋理坐标等屬性.
- <2> 片元的屬性則是圖元上頂點資料等經過插值而确定的..這裡生成的片元将會包含主顔色和次顔色. glShadeMode() 函數的作用将會這裡展現.即使用插值(平滑着色) 或者使用最後一個頂點顔色(平面着色)
- <3> 點寬 線寬.多邊形模式,正面背面等一些特征也将是這階段發生作用.
- <4> 反走樣也是這個階段起作用.
階段6 片元處理
- <1>上紋理:通過紋理坐标取得紋理記憶體中相對應的顔色。
- <2> 霧化:通過片元距離目前視點位置修改顔色.
- <3> 顔色彙總..這個與混合完全不同概念.将紋理,主定義的顔色,霧化的顔色,次顔色光照階段計算的顔色 彙總一起.
階段7 逐個片元的操作
- <1> 所有的一些測試 像素所有權 剪切(glScissor) Alpha測試(glAlphaFunc) 模版測試(glStencilFunc) 深度測試 (glDephtFunc) 混合(glBlendFunc)
這些操作将會最後影響其在幀緩沖區的顔色值.
階段8 幀緩沖操作
- <1>這個階段執行幀緩沖的寫入等操作等..最後産生了顯示出來的像素.
glColorMask、glStrncilMask、glDepthMask、glClearDepht、glClearStencil、glClearColor 等.将在這個階段影響寫入的值.
以上隻是讨論OpenGL 圖元繪制的基本過程 那麼基于像素圖像繪制.幾乎形同之上..隻是在光栅化處理前的操作不一樣.即經過像素解碼 像素傳輸.栅格化 最後形成片元...片元之後的處理完全一樣..
可程式設計管線可以替換的功能
在着色器程式設計領域..你将可實作
- Vertex Shader(頂點着色器) 替換 頂點處理階段
- Fragment Shader(片元着色器,又叫像素着色器) 替換 片元處理階段
- Geometry Shader(幾何着色器) 替換 圖元組裝階段..
因為這三個階段所決定都是最重要效果的階段..對于這些的可程式設計将帶來非常大的好處以及可控制的渲染!!
在前面的固定功能管線提到了,在階段5:栅格化操作 過程中, 片元的屬性會由圖元上頂點資料等經過插值而确定。在頂點着色器處理完畢後,OpenGL都會将頂點與頂點之間的片元(基本上可以了解為像素)的屬性(如位置坐标、紋理坐标)進行線性插值。是以,在紋理坐标為(1,0)和(0,0)中間的片元會得到一個(0.5,0)的紋理坐标,在紋理坐标為(0,0)和(1,1)之間的片元會得到一個(0.5,0.5)的紋理坐标。然後将這些經過內插補點處理之後的片元交給片元着色器處理。片元着色器确定最終的片元顔色。