1. 程式人生 > >GPU渲染簡介

GPU渲染簡介

對比 wrap 抗鋸齒 轉換成 負載不均 出現 imx6q 經典的 現在

  • 3D繪圖一些基本概念

  • 基本元素

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

    技術分享圖片

    圖 1.1 頂點

    技術分享圖片

    圖 1.2 邊

    技術分享圖片

    圖 1.3 面

  • 傳統渲染流程(pipeline)

    技術分享圖片

    圖 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就能在顯示器上看到圖像了。

  • 可編程著色器(Programmable Shader)

    在傳統渲染流程中,人們對像素的操作實際上僅僅能夠稱之為染色,對特效的處理只能通過固定的單元來實現,每一代圖形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)語言。

  • 統一著色器架構(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 統一著色架構

  • IMX6Q基於OpenGL ES下的渲染流程

  • 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渲染流程

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

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

    技術分享圖片

    圖 2.3 IMX6Q GPU工作流程


  • GPU渲染簡介