1. 程式人生 > >OpenGL 渲染管線理論

OpenGL 渲染管線理論

投影矩陣 www. ref http 所有權 一次 執行 microsoft index

學習著色器,並理解著色器的工作機制,就要對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 頂點處理操作:

不管以上的幾何對象是如何指定的,所有的幾何數據都將會經過這個階段,這個階段負責的則是逐個頂點的操作.

在這個階段能做的工作則是:

  1. 頂點變換:根據模型視圖和投影矩陣變換
  2. 光照計算和法線變換(法線矩陣 是模型矩陣的左上角3*3的逆矩陣)和法線規格化
  3. 紋理坐標變換.(紋理矩陣)
  4. 材質狀態:紋理坐標生成

而最重要的則是變換以及光照. 每個頂點在這個階段分別是單獨處理的.

這個階段所接收到的數據則是每個頂點的屬性特征..輸出則是變換後的頂點數據.

階段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)的紋理坐標。然後將這些經過差值處理之後的片元交給片元著色器處理。片元著色器確定最終的片元顏色。

原文地址http://guzhou.me/glsl%E5%AD%A6%E4%B9%A0%E7%AC%AC%E4%B8%80%E8%AF%BE%EF%BC%9Aopengl%E7%9A%84%E6%B8%B2%E6%9F%93%E7%AE%A1%E7%BA%BF/

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

OpenGL 渲染管線理論