GPU渲染簡介

2021-08-14 19:03:41 字數 3566 閱讀 9466

乙個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。頂點著色器的處理單位是頂點,也就是說輸入進來的每個頂點都會呼叫一次頂點著色器。頂點著色器需要完成的工作主要有 座標變換和逐頂點光照。當然,除了這兩個主要任務外,頂點著色器還可以輸出後續階段所需的資料。座標變換,顧名思義,就是對頂點的座標進行某種變...