GPU渲染管線概述

1.頂點着色器

頂點着色器是流水線的第一個階段,它的輸入來自於CPU。頂點着色器的處理單位是頂點,也就是說輸入進來的每一個頂點都會調用一次頂點着色器。
頂點着色器須要完成的工做主要有:座標變換和逐頂點光照。固然,除了這兩個主要任務外,頂點着色器還能夠輸出後續階段所需的數據。
座標變換,顧名思義,就是對頂點的座標進行某種變換。例如咱們能夠經過改變頂點位置來模擬水面,布料等。
一個最基本的頂點着色器必須完成的一個工做是:把頂點座標從模型空間轉換到齊次剪裁空間。相似下面代碼:編程

o.pos=mul(UNITY_MVP,v.position);

2.裁剪

因爲咱們的場景可能會很大,而攝像機的視野範圍頗有可能不會覆蓋全部的場景物體,一個很天然的想法就是,那些不在攝像機視野範圍內的物體不須要被處理,而裁剪就是爲了完成這個目的而被提出來的。
一個圖元和攝像機的關係有3種:測試

  • 徹底在視野內
  • 部分在視野內
  • 徹底在視野外
    部分在視野內的圖元須要裁剪,例如一條線段的一個頂點在視野內,而另外一個頂點在視野外,那麼視野外部的頂點應該使用一個新的頂點來代替,這個新的頂點位於這條線段和視野邊界的交點處。

3.屏幕映射

這一步輸入的座標仍然是三維座標系。屏幕映射的任務是把每一個圖元的x和y座標轉換到屏幕座標系下,屏幕座標系是一個二維座標系,它和咱們用於顯示畫面的分辨率有很大關係。
屏幕映射獲得的屏幕座標決定了這個頂點對應屏幕上哪一個像素以及距離這個像素有多遠。
opengl的屏幕座標原點是左下角,而directx是左上角,若是你發現你獲得的圖像是倒轉的,那麼頗有可能就是這個緣由形成的。code

4.三角形設置

由這一步就進入了光柵化階段,從上一個階段輸出的信息是屏幕座標下的頂點位置以及和它們相關的額外信息,如深度值、法線方向、視角方向等,光柵化有兩個最重要的目標:計算每一個圖元覆蓋了哪些像素,以及爲這些像素計算他們的顏色。光柵化的第一個流水線階段是三角形設置,這個階段會計算光柵化一個三角網格所需的信息。
具體來講,上一個階段輸出的都是三角網格的頂點,即咱們獲得的是三角網格每條邊的兩個端點。但若是要獲得整個三角網格對像素的覆蓋狀況,咱們就必須計算每條邊上的像素座標。爲了可以計算邊界像素的座標信息,咱們就須要獲得三角形邊界的表示方式。這樣一個計算三角形網格表示數據的過程就叫作三角形設置,它的輸出是爲了下一個階段作準備。it

5.三角形遍歷

三角形遍歷階段將會檢查每一個像素是否被一個三角形網格所覆蓋。若是被覆蓋的話,就會生成一個片元,而這樣一個找到哪些像素被三角網格覆蓋的過程就是三角形遍歷,這個階段也被稱爲掃描變換。
三角形遍歷階段會根據上一個階段的計算結果來判斷一個三角網格覆蓋了哪些像素,並使用三角網格3個頂點的頂點信息對整個覆蓋區域的像素進行插值。io

6.片元着色器

片元着色器是另外一個很是重要的可編程着色器階段,片元着色器的輸入是上一個階段對頂點信息插值獲得的結果,更具體來講,是根據那些從頂點着色器輸出的數據插值獲得的。而它的輸出是一個或多個顏色值。
這一階段能夠完成不少重要的的渲染技術,其中最重要的技術之一就是紋理採樣。爲了在片元着色器中進行紋理採樣,咱們一般會在頂點着色器階段輸出每一個頂點對應的紋理座標,然和通過光柵化階段對三角網格的3個頂點對應的紋理座標進行插值後,就能夠獲得其覆蓋的片元的紋理座標了。渲染

7.逐片元操做

逐片元操做是opengl中的說法,在directx中,這一階段被稱爲輸出合併階段。
這一階段有幾個主要任務:遍歷

  • 決定片元的可見性。涉及不少測試工做,如深度測試,模版測試等。
  • 若是一個片元經過了全部的測試,就須要把這個片元的顏色值和已經存儲在顏色緩衝區中的顏色進行合併技術

    至此,整個GPU渲染管線就結束了。數據

相關文章
相關標籤/搜索