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


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

我們一般使用吞吐量(throughput)來描述一個階段的處理速度,而不是幀率。因為幀率會受到設備更新的限制而導致實際速度比幀率所標示的更慢。

一個例子:

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


 

一個渲染管線可以粗略的按照執行順序分成三大階段:

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

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

下面是一張圖:

一、應用階段

這個階段的目標就是為幾何階段產生合適的圖元數據,一般來說,很多工作都在這個階段完成,諸如碰撞檢測、動畫、輸入、當然還有一些加速管線的算法,比如層次視椎剔除(hierarchical view frustum culling)等等。

二、幾何階段

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

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

三、光柵階段

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

 

 最后要梳理一下各種shader通常都做什么:

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

geometry shader:操作圖元頂點(primitive概念看下方)——圖元着色、銷毀/創建圖元

pixel(fragment) shader:像素着色

幾何primitive: points、lines、triangles

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM