第2章 渲染流水線

2021-10-20 13:56:35 字數 1817 閱讀 6887

準備好場景資料(攝像機位置, 視錐體, 場景中的模型, 場景中的光源)

粗粒度剔除(剔除不可見的物品)

設定好每個模型的渲染狀態:材質(漫反射顏色,高光反射顏色, 紋理, 使用的shader)

輸出渲染所需要的幾何資訊(渲染圖元)給洗下乙個階段

把頂點座標變換到螢幕空間, 再交給光柵器處理

決定每個渲染圖元中哪些畫素應該被繪製在螢幕上.

對上一階段得到的逐頂點資料,進行插值.

頂點著色器的主要工作: 座標變化 和逐頂點的光照

螢幕對映得到的螢幕座標決定了這個頂點對應螢幕上哪個畫素以及距離這個畫素有多遠

這個階段會計算光柵化買乙個三角形網格所需要的資訊.

因為上個階段輸出的都是三角網格的頂點,但是我們需要三角形邊上的資訊.

計算三角形網格表示的資料過程就叫做三角形設定

檢查每個畫素是否被三角形覆蓋, 並且使用頂點資訊,對內部資訊進行插值的處理.

這個階段首先要解決的問題是每個片元的可見性問題.

模版測試

通過將當前值與緩衝區模版的值比較.

一般開發者這樣定義, 如果當前值< 緩衝區, 則通過測試. > 則不通過

深度測試

如果這個片元的深度值大於等於當前深度緩衝區中的值,那麼就會捨棄它。這是因為, 我們總想只顯示出離攝像機最近的物體,而那些被其他物體遮擋的就不衙要出現在螢幕上 。

而深度緩衝則決定 測試通過後, 是否需要將值寫入緩衝區

混合因為顏色緩衝區可能有上一次渲染的結果, 那麼這次算出來的結果應該怎麼處理呢?

對於不透明的物體, 可以關閉**混合(blend)**操作, 直接覆蓋上一次渲染的顏色結果.

半透明的物體, 則需要將緩衝區顏色與當前計算的顏色進行混合

小結雖然從邏輯上說, 這些測試是在片元著色器後面進行.

但是對於大多數的gpu, 它們會盡可能在執行片元著色前, 進行測試.

在片元著色器進行之前做的深度測試技術, 叫做early-z技術. (本書後面章節會提到)

但是但是, 提前測試又可能會和片元著色器操作衝突. 書本中提到, 提前進行透明度測試, 但後面這個片元又無法通過透明度測試. 兩者就會衝突, 導致效能下降.

雙重緩衝

前置緩衝是之前螢幕上的影象, 後置緩衝是正在渲染的影象, 為了乙個影象中, 既有前一幀影象,又有當前影象.

glsl, hslsl, sg都是高階語言.

這些語言會被編譯成與機器無關的組合語言, 又稱為中間語言.

這些中間語言再交給顯示卡驅動翻譯成真正的機器語言, 即gpu可以理解的語言

優點: 跨平台,由顯示卡驅動來完成著色器的編工作, 只要顯示卡驅動支援glsl就可以執行.

缺點: glsl編譯結果取決於硬體**商. 他們對glsl編譯結果不盡相同, 會造成編譯結果不一致

微軟控制的著色器編譯, 只能win

就是cpu 往 gpu 發出的命令, 如果命令過於瑣碎, 數量又多,會降低效能.

打個比方, 複製1000個1kb的檔案和複製1m的檔案, 前者相當於呼叫1000次draw call, 後者1次draw call. gpu處理渲染很快, 但cpu處理命令, 需要在執行命令之前做一些準備工作, 非常耗時.

批處理, 將瑣碎的draw call合併成乙個批(batch), 即乙個大的draw call.

渲染流水線

應用階段 cpu準備資料,skinmeshrender,meshfilter,meshrender 頂點資料,三角形資料,法線資料,切線資料,渲染設定指令,紋理資料,uv資料 由cpu傳送給gpu,即一次drawcall 幾何階段 頂點變換,計算頂點顏色 如逐頂點光照 齊次裁剪空間,透視除法,歸一化...

UnityShader 渲染流水線

渲染具體流程 幾何階段 光柵化階段 渲染流水線的最終目的在於生成或者說是渲染一張紋理,即我們在螢幕上看到的所有效果。它的輸入是乙個虛擬攝像機 一些光源 一些shader以及紋理等。渲染流程分為3個階段 應用階段 幾何階段 光柵化階段。圖中,綠色表示該階段是完全可程式設計控制的,黃色表示可以配置但不是...

第二章 渲染流水線(1)

1.渲染流程概述 幾何階段 光柵化階段 2.cpu和gpu之間的通訊 應用階段 輸出 渲染命令,渲染狀態 資料從硬碟 hdd 中載入到系統記憶體 ram 中,網格和紋理等載入到視訊記憶體 vram 中。設定場景中的網格的渲染方式 頂點著色器,片元著色器,光源屬性,材質 由cpu發起的命令,指向乙個需...