實時渲染(一)——圖形渲染管線

在渲染管線中是最慢的階段決定整個渲染的速度。算法

咱們通常使用吞吐量(throughput)來描述一個階段的處理速度,而不是幀率。由於幀率會受到設備更新的限制而致使實際速度比幀率所標示的更慢。數組

一個例子:動畫

假設一個設備爲60赫茲,這意味着這個設備16.666666ms刷新一次,這時剛好有一管線階段花費了62.5ms執行完成,因爲63大於16.666666*3,小於16.666666*4,因此他實際上想要最終完成工做必須等待下一次設備刷新。因此真實的執行時間折算下來其實不止62.5ms而是趨近於66ms。固然,若是關閉了垂直同步就另當別論了。spa


 

一個渲染管線能夠粗略的按照執行順序分紅三大階段:3d

  1. 應用階段
  2. 幾何階段
  3. 光柵階段

這些階段又能夠細分爲更多的子階段,注意這些都是功能性的分配,在實現上爲了效率等因素每每會合並一些階段或者拆分一些階段等等。blog

下面是一張圖:同步

1、應用階段it

這個階段的目標就是爲幾何階段產生合適的圖元數據,通常來講,不少工做都在這個階段完成,諸如碰撞檢測、動畫、輸入、固然還有一些加速管線的算法,好比層次視椎剔除(hierarchical view frustum culling)等等。模板

2、幾何階段效率

幾何階段集中於逐多邊形操做和逐頂點操做。

  1. 模型-視圖轉換:模型座標-->世界座標-->相機座標
  2. 頂點着色:計算着色方程根據材質數據(位置、法線、顏色、其餘着色方程須要的數據等等)決定光照效果,結果能夠是(顏色、向量、紋理座標或者其餘種類的着色數據)。一般在世界空間中發生、有時候會把相關實體轉換到其餘空間,並在此空間進行計算。
  3. 投影:略
  4. 裁剪:在單位立方體以外的基元被捨棄,而徹底在單位立方體以內的基元被保留;相交的基元則進行剪切,生成新的頂點,而老的被丟棄。
  5. 屏幕映射:只有已裁剪的部分纔會被傳遞給屏幕映射,座標仍然是3維的。將x/y轉換成平面座標。轉換後的x/y叫作屏幕座標。有一個注意事項是:如何把浮點數映射到像素以及某些系統之間屏幕作座標原點的問題。

3、光柵階段

  1. 創建三角形:計算三角形表面差值等數據,這個數據將會用於下一階段的掃描轉換,以及幾何階段生成的各類着色數據的插值。
  2. 遍歷三角形:檢查每一個被三角形覆蓋了中心的像素,併爲什麼三角形重疊的部分生成片斷。查找那些在三角形以內的像素或者採樣的過程叫作掃描轉換。生成的每一個在三角形內的片斷都是根據三角形頂點插值出來的,這些片斷的數據包括深度以及各類來自幾何階段的着色數據。
  3. 像素着色:插值完畢的着色數據輸入其中,執行全部的逐像素着色操做,並將一個或者多個顏色傳遞給下一個階段。紋理技術也在此階段實現。
  4. 合併:每一個像素的信息被存儲在顏色緩衝中,它是顏色的矩形數組(每一個顏色擁有紅、綠、藍三部分)。合併階段負責將着色階段生成的片斷顏色和當前緩衝中存儲的顏色進行組合。而且包含可見性檢測、模板操做等等。

 

 最後要梳理一下各類shader一般都作什麼:

vertex shader:模型-視圖轉換,頂點着色,投影

geometry shader:操做圖元頂點(primitive概念看下方)——圖元着色、銷燬/建立圖元

pixel(fragment) shader:像素着色

幾何primitive: points、lines、triangles

相關文章
相關標籤/搜索