GPU渲染簡介

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

  2. 基本元素

    一個3D圖形是由一些小的基本元素(頂點,邊,面,多邊形)構成,每一個元素能夠單獨來操做。如圖 1.一、圖 1.二、圖 1.3所示。程序員

    圖 1.1 頂點編程

    圖 1.2 邊數據結構

    圖 1.3 面架構

  3. 傳統渲染流程(pipeline)

    圖 1.4 傳統渲染流程優化

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

  4. 幾何處理階段

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

    圖 1.5 座標系轉換圖片

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

    圖 1.6 頂點生成工作流

    圖 1.7 多邊形生成

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

    圖 1.8 初步貼圖和打光階段

  5. 光柵化階段

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

    圖 1.9 光柵化三角形

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

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

     

     

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

    在傳統渲染流程中,人們對像素的操做實際上僅僅可以稱之爲染色,對特效的處理只能經過固定的單元來實現,每一代圖形API所可以實現的特定的特效,都須要經過預先將其固化成固定指令的形式出如今硬件中。而對於像素的處理,也僅能侷限與固化指令所可以容許的範圍內,一旦像素進入pipeline,程序員就失去了對它的控制。爲了解決這一局面,可編程着色器誕生了。如圖 1.十二、圖 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.1六、圖 1.17

    圖 1.16 分離着色架構

    圖 1.17 統一着色架構

     

     

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

  11. OpenGL ES渲染流程

    OpenGL ES 1.x版本是傳統的固定pipeline渲染,而2.x版本日後是可編程着色pipeline渲染,如圖 2.一、圖 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工做流程

相關文章
相關標籤/搜索