GPU渲染簡介

  1. 3D繪圖一些基本概念

  2. 基本元素

    一個3D圖形是由一些小的基本元素(頂點,邊,面,多邊形)構成,每個元素可以單獨來操作。如圖 1.1、圖 1.2、圖 1.3所示。

    圖 1.1 頂點

    圖 1.2 邊

    圖 1.3 面

  3. 傳統渲染流程(pipeline)

    圖 1.4 傳統渲染流程

    如圖 1.4所示,一個傳統的渲染流程包括幾何處理階段(Geometry Stage)和光柵化階段(Rasterization Stage)。

  4. 幾何處理階段

    幾何處理階段又稱爲T&L(transforming & lighting)階段,主要負責將三維座標系中的頂點(vertex)轉換成二維座標系中的點(transforming階段)、對頂點做初步光照計算(lighting階段)。由於目前顯示器只能以二維方式顯示,所以要將各個點做座標系的轉換。如圖 1.5所示,三維座標系中的三個頂點根據觀察的方向(screen position)投影到二維座標系中,從而得到了這三個點的二維座標。

    圖 1.5 座標系轉換

    接着GPU根據程序規定好的這些點之間的關係,將這些點連接起來,這樣一個物體就有了外形了,如圖 1.6、圖 1.7所示。

    圖 1.6 頂點生成

    圖 1.7 多邊形生成

    完成上述工作後,接下來就要進入初步貼圖(Vertex Texture)和初步光照計算(Vertex Lighting)階段。如圖 1.8所示:

    圖 1.8 初步貼圖和打光階段

  5. 光柵化階段

    經過幾何階段處理可以得到二維平面中的圖像。但是要將這個二維圖像在顯示器上顯示出來,還必須要將圖像轉換爲一系列的片元(fragment),片元在接下來的處理中有可能變成最終圖像中的像素。如圖 1.9、圖 1.10所示。

    圖 1.9 光柵化三角形

    圖 1.10 光柵化三角形並進行插值着色

    一個片元就是一個數據結構,這個數據結構中包含位置、顏色、深度等信息。然後對這些片元進行貼圖融合、光照計算、或者霧化等其他操作以形成最終圖片中的像素。之後對這些像素做最後的縮放和抗鋸齒處理,形成最終的圖像,將這些圖像數據輸出到系統中的frambuffer就能在顯示器上看到圖像了。

     

     

  6. 可編程着色器(Programmable Shader)

    在傳統渲染流程中,人們對像素的操作實際上僅僅能夠稱之爲染色,對特效的處理只能通過固定的單元來實現,每一代圖形API所能夠實現的特定的特效,都需要通過預先將其固化成固定指令的形式出現在硬件中。而對於像素的處理,也僅能侷限與固化指令所能夠允許的範圍內,一旦像素進入pipeline,程序員就失去了對它的控制。爲了解決這一局面,可編程着色器誕生了。如圖 1.12、圖 1.13所示爲固定pipeline和可編程pipeline渲染的球的對比。

    圖 1.12 固定pipeline渲染的幾種球

    圖 1.13 可編程pipeline渲染下的球

  7. 可編程着色器下的渲染流程

    圖 1.14 可編程的渲染流程

    如圖 1.14所示,可編程渲染流程與傳統渲染流程不同的是,頂點着色器(Vertex Shader)和片元着色器(Fragment Shader)是可編程的。片段着色器在有的圖形API中叫做像素着色器(Pixel Shader)。頂點着色器主要負責頂點的幾何關係運算,像素着色器主要負責像素顏色計算等。

  8. 着色器語言

    着色器是用來實現圖像渲染的,用來代替固定pipeline的一段可編輯程序。Vertex Shader和Fragment Shader是完全分離的兩組程序,它們在GPU中擁有不同的寄存器要求,不同的指令格式以及不同的運算器要求。Vertex Shader程序可以被GPU中的可編程頂點處理單元(Programmable Vertex Processor)處理,同樣,Fragment Shader程序可以被GPU中的可編程片元處理單元(Programmable Fragment Processor)處理。

    Vertex Shader程序和Fragment Shader程序都是着色程序(Shader Program)。用來編寫着色程序的語言就被稱爲着色器語言(Shader Language)。目前主流的着色器語言有三種:基於OpenGL的GLSL(OpenGL Shading Language),基於Direct3D的HLSL(High Level Shading Language),還有Nvidia的Cg(C for Graphic)語言。

  9. 統一着色器架構(Unfied Shader Architecture)

    在傳統的硬件中,GPU廠商使用固定比例的Vertex Shader單元和Fragment Shader單元,比如經典的1:3黃金渲染架構,即Vertex Shader單元和Fragment Shader單元比例爲1:3。這種固定比例的做法有時會導致嚴重的單元利用率低問題。比如一段着色程序中僅包含10%的Vertex Shader指令,剩下的90%都是Fragment Shader指令,那麼當Fragment Shader單元在全力運行的時候Vertex Shader是處於空閒的狀態,反之亦然。而一段實際的着色程序不可能完全按照硬件的的Shader比例來做到指令密度的平均優化。如圖 1.15所示,上部分表示頂點着色單元滿負荷運行像素着色單元空閒的情況,下部分正好相反。

    圖 1.15 Shader負載不均衡

    爲了解決這種情況,統一着色架構誕生了,統一架構將傳統的Vertex Shader和Fragment Shader從軟件和硬件層面上予以統一。着色程序內部不再需要嚴格按照格式區分Vertex/Pixel。硬件上Shader單元也從過去的分離式固定功能變成了更加強大完整且統一的通用ALU。如圖 1.16、圖 1.17

    圖 1.16 分離着色架構

    圖 1.17 統一着色架構

     

     

  10. IMX6Q基於OpenGL ES下的渲染流程

  11. OpenGL ES渲染流程

    OpenGL ES 1.x版本是傳統的固定pipeline渲染,而2.x版本往後是可編程着色pipeline渲染,如圖 2.1、圖 2.2所示。

    圖 2.1 OpenGL ES 1.x渲染流程

    圖 2.2 OpenGL ES 2.x渲染流程

     

  12. 基於OpenGL ES2下的IMX6Q GPU工作流程

    如圖 2.3所示,爲imx6q中gpu在opengl es2下的渲染流程。

    圖 2.3 IMX6Q GPU工作流程


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