Just My Life & My Work

繪圖管線 (Rendering Pipeline)

還沒接觸電腦圖學之前,傻傻地以為繪圖只要交給軟體來做就好,完全忽略硬體這部份。然而其實軟硬體兩者都很重要,只有好的演算法沒有硬體加速,無法彰顯效能,而只有硬體加速而沒有好的演算法,無法發揮硬體的潛能。於此學習電腦圖學,有必要從基本的繪圖管線(Rendering Pipeline)瞭解起。

這裡先討論傳統的固定功能管線Fixed Function Pipeline,之後就可以瞭解進階的Shader程式設計。話說「Shader」這名詞當時對初學者的我只知道直接翻譯是「陰影者」,後來才知道自從有了可程式化得繪圖晶片後,程式設計師可以對這些晶片寫作程式自訂場景(Scene)中頂點的轉換過程,是所謂的「Vertex Shader」,此外也可以寫程式來控制畫面(Screen)上每個像素的著色計算,是所謂「Pixel Shader」。總之,懂得寫Shader的程設師,可以做出他人無法達到的效果。

話說回來,3維繪圖有三種技術,分別是Ray Tracing(光線追蹤)Radiosity(輻射度)Rasterizing(光柵化)

以上為三種繪圖演算法,接著我們想知道如何搭配硬體來使繪圖有最好的效能呢?基於複雜度、分支度、Locality來分析,雖然前兩者的演算法可以得到相當真實的效果,然而其複雜度、分支度大而Locality低,製造硬體成本和困難度較高,因此目前以硬體做加速的演算法是Rasterizing

什麼是Rasterizing(光柵化)?由Vector graphics(向量圖形)轉換為Raster graphics(光柵圖形)的過程。至於Ray Tracing(光線追蹤)、Radiosity(輻射度)已經很常聽見,在此不多做介紹。

繪圖管線(Rendering Pipeline)

–> Transformation & Lighting

–> Viewport Transformation

–> Clipping & culling

–> Primitive Assembly & Triangle Setup

–> Rasterization

–> Pixel operation

–> Raster operation

以上是簡化過的繪圖管線,不過它包含現今3D pipeline中主要部份。以下簡單列出管線各階段的行為作用:

Transformation & Lighting

Object coordinate—–>World coordinate—–> Eye coordinate
Model transformation   View Transformation

Viewport Transformation & Clipping & Culling

Eye coordinate —–> Clip coordinate —–> Screen coordinate
     Projection transformation Viewport Transformation

Primitive Assembly & Triangle Setup將Vertex根據Primitive,還原出Mesh結構&減少處理的三角面數量

  • Clipping
  • Back-face Culling

Rasterization從頂點(Vertex)變成了像素(Pixel)

  • scan-line
  • Z字形

Pixel operation算出Pixel color的過程

  • Texture operation
  • Blending
  • Filtering

Raster operation把Pixel color填進frame buffer的過程

  • Scissor Test (剪切測試)
  • Alpha Test (透明度測試)
  • Depth & Stencil Test (深度與模版測試)
  • Blending

參考:3D繪圖(3D Graphics Pipeline),有非常詳細的解說,寫於96/03/03,很棒。

Comments on: "繪圖管線 (Rendering Pipeline)" (2)

  1. […] 繪圖管線真是博大精深!學了一整年的計圖還不一定能完全背起來,但真正重要的是瞭解管線中每一個步驟的功能,會有如此的順序一定有它的道理在,我想也只能隨著經驗增長,才能逐漸完全瞭解管線各階段的精髓吧!可以參考繪圖管線、著色器。 […]

  2. […] 關於vertex shader:最後一行gl_Position = ftransform();還有其它兩種寫法,可以看第一欄程式碼的註解,而最簡短的這一行有優化過。gl_ModelViewMatrix * gl_Vertex和gl_NormalMatrix * gl_Normal分別將OpenGL application的頂點和法向量轉換到eye coordinate,而gl_ModelViewProjectionMatrix * gl_Vertex則是將vertex轉換到screen coordinate。詳情可看繪圖管線。 […]

隨意留個言吧:)~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲