乙個3d圖形是由一些小的基本元素(頂點,邊,面,多邊形)構成,每個元素可以單獨來操作。如圖 1.1、圖 1.2、圖 1.3所示。
圖1.1
頂點
圖1.2
邊
圖1.3
面
圖1.4
傳統渲染流程
如圖 1.4所示,乙個傳統的渲染流程包括幾何處理階段(geometry stage)和光柵化階段(rasterization stage)。
幾何處理階段又稱為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
初步貼圖和打光階段
經過幾何階段處理可以得到二維平面中的影象。但是要將這個二維影象在顯示器上顯示出來,還必須要將影象轉換為一系列的片元(fragment),片元在接下來的處理中有可能變成最終影象中的畫素。如圖 1.9、圖 1.10所示。
圖1.9
光柵化三角形
圖1.10
光柵化三角形並進行插值著色
乙個片元就是乙個資料結構,這個資料結構中包含位置、顏色、深度等資訊。然後對這些片元進行貼圖融合、光照計算、或者霧化等其他操作以形成最終中的畫素。之後對這些畫素做最後的縮放和抗鋸齒處理,形成最終的影象,將這些影象資料輸出到系統中的frambuffer就能在顯示器上看到影象了。
在傳統渲染流程中,人們對畫素的操作實際上僅僅能夠稱之為染色,對特效的處理只能通過固定的單元來實現,每一代圖形api所能夠實現的特定的特效,都需要通過預先將其固化成固定指令的形式出現在硬體中。而對於畫素的處理,也僅能侷限與固化指令所能夠允許的範圍內,一旦畫素進入pipeline,程式設計師就失去了對它的控制。為了解決這一局面,可程式設計著色器誕生了。如圖 1.12、圖 1.13所示為固定pipeline和可程式設計pipeline渲染的球的對比。
圖1.12
固定pipeline
渲染的幾種球
圖1.13
可程式設計pipeline
渲染下的球
圖1.14
可程式設計的渲染流程
如圖 1.14所示,可程式設計渲染流程與傳統渲染流程不同的是,頂點著色器(vertex shader)和片元著色器(fragment shader)是可程式設計的。片段著色器在有的圖形api中叫做畫素著色器(pixel shader)。頂點著色器主要負責頂點的幾何關係運算,畫素著色器主要負責畫素顏色計算等。
著色器是用來實現影象渲染的,用來代替固定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)語言。
在傳統的硬體中,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
統一著色架構
opengl es 1.x版本是傳統的固定pipeline渲染,而2.x版本往後是可程式設計著色pipeline渲染,如圖 2.1、圖 2.2所示。
圖2.1 opengl es 1.x
渲染流程
圖2.2 opengl es 2.x
渲染流程
如圖 2.3所示,為imx6q中gpu在opengl es2下的渲染流程。
圖2.3 imx6q gpu
工作流程
GPU渲染管線
3 光柵化階段 4總結 主要是為了得到三維頂點的法線,紋理等資料資訊 但是不能夠 幾何階段這個座標系轉化如下 這個階段主要做的事情事頂點著色器 模型變換,檢視變換,頂點著色 模型變換 將建模座標系轉化為世界座標系,相當於以物體為中心轉化為以世界為中心的轉化,可以理解為為模型統一乙個座標系 檢視變換 ...
GPU渲染管線概述
頂點著色器是流水線的第乙個階段,它的輸入來自於cpu。頂點著色器的處理單位是頂點,也就是說輸入進來的每個頂點都會呼叫一次頂點著色器。頂點著色器需要完成的工作主要有 座標變換和逐頂點光照。當然,除了這兩個主要任務外,頂點著色器還可以輸出後續階段所需的資料。座標變換,顧名思義,就是對頂點的座標進行某種變...
GPU渲染管線概述
頂點著色器是流水線的第乙個階段,它的輸入來自於cpu。頂點著色器的處理單位是頂點,也就是說輸入進來的每個頂點都會呼叫一次頂點著色器。頂點著色器需要完成的工作主要有 座標變換和逐頂點光照。當然,除了這兩個主要任務外,頂點著色器還可以輸出後續階段所需的資料。座標變換,顧名思義,就是對頂點的座標進行某種變...