渲染流水线
此文章收錄于我主頁頂置的:Unity Shader入門精要文章目錄,點擊即可跳轉。
前言:在開始學習之前,我們有必要要了解什么是Shader,即著色器,與之關系非常緊密的就是渲染流水線,我們要想了解Shader就必須了解渲染流水線的工作流程。
渲染流水線的最終目的是渲染一張二維紋理,它的輸入是一個虛擬攝像機、一些光源、一些Shader以及紋理。
1.1什么是流水線?
流水線在生活中應用很廣泛,在工業生產中尤其常見。
例如有一個生產汽車的工場,我將一個汽車的生成流程分成四個步驟,每個步驟都需要兩個小時才能夠完成,這樣在沒有生產流水線之前,只有每臺汽車完成可所有這4個工序后才能夠生產下一臺汽車,那么要生產出一臺汽車,我們就需要2*4個小時。
現在我們有了生成流水線之后,生產一臺汽車還是需要四個工序,但是并不需要從頭到尾完成全部的工序,而是每個工序由專門的人來完成,所有工序并行進行,也就是說,當工序一完成后的汽車產品,將會遞交給工序二,工序一接著做工序一該做的,工序二完成后遞交給工序三,工序二接著做第二個工序需要做的…
這里拿一個餅干包裝的流水線工作圖來舉個例子:
使用流水線的好處在于可以提高單位時間的產量,在汽車生產的工序中,使用流水線生產后,每兩個小時就能夠生產出一臺汽車,而且我們能夠發現,流水線中決定生產速度的是最慢的那一道工序,即耗時最多的工序是性能瓶頸。
在理想情況下,如果把一個非流水線系統分成n個流水線階段,且每個階段耗費時間相同的話,會使整個系統得到n倍的速度提升。
1.2什么是渲染流水線?
上面關于流水線的概念也適用于計算機的圖像渲染中。渲染流水線的工作任務是由一個三維場景出發、生產或者渲染一張二維圖像,換句話來說就是計算機需要從一系列的頂點數據、紋理等信息出發,把這些信息最終轉換成一張人眼可見的圖像,而這個工作通常是由CPU和GPU共同完成
一個渲染流程分為三個階段:應用階段、幾何階段、光柵化階段
值得注意的是:這里僅僅是概念性階段,每個階段本身通常也是一個流水線系統,既包含了子流水線階段。
1.2.1 應用階段
從名字我們可以看出,這個階段是由我們的應用主導的,因此通常由CPU負責實現。換句話說,我們這些開發者具有這個階段的絕對控制權。
在這階段中,開發者有3個主要任務:
首先,我們需要準備好場景數據,例如攝像機的位置、視錐體、場圾中包含了哪些模型、使用了哪些光源等等。
其次,為了提高誼染性能,我們往往需要做一個粗粒度 剔除(ullig)工作,以把那些不可見的物體剔除出去, 這樣就不需要再移交給幾何階段進行處理。
最后,我們需要設置好每個模型的渲染狀態。這些渲染狀態包括但不限于它使用的材質(漫反射顏色、高光反射顏色)、使用的紋理、使用的Shader 等。這階段最重要的輸出是渲染所需的幾何信息,即渲染圖元(rendering primitives)。通俗來講,渲染圖元可以是點、線、三角面等。這些渲染圖元將會被傳遞給下一個階段一幾何階段。
由于是由開發者主導這一階段, 因此應用階段的流水線化是由開發者決定的。
1.2.2 幾何階段
幾何階段用于處理所有和我們要繪制的幾何相關的事情。例如,決定需要繪制的圖元是什么,怎樣繪制它們,在哪里繪制它們。這一階段通常在GPU上進行。
幾何階段負責和每個渲染圖元打交道,進行逐頂點、逐多邊形的操作。這個階段可以進一步分成更小的流水線階段。
幾何階段的一個重要任務就是把項點坐標變換到屏幕空間中,再交給光柵器進行處理。通過對輸入的渲染圖元進行多步處理后,這一階段將會輸出屏幕空間的二維頂點坐標、每個頂點對應的深度值、著色等相關信息,并傳遞給下一個階段。
1.2.3光柵化階段
這一階段將會使用上個階段傳遞的數據來產生屏幕上的像素,并渲染出最終的圖像。這一階段也是在GPU上運行。光柵化的任務主要是決定每個渲染圖元中的哪些像素應該被繪制在屏幕上。它需要對上一個階段得到的逐頂點數據(例如紋理坐標、頂點顏色等)進行插值,然后再進行逐像素處理。
和上一個階段類似,光柵化階段也可以分成更小的流水線階段。
讀者需要把上面的3個流水線階段和我們將要講到的GPU流水線階段區分開來。
提示:
這里的流水線均是概念流水線,是我們為了給一個渲染流程進行基本的功能劃分而提出來的。下面要介紹的GPU流水線,則是硬件真正用于實現上述概念的流水線。
點擊可查看我的所有Shader學習文章,持續更新:Unity Shader入門精要文章目錄
總結
- 上一篇: Boll布林带突破策略
- 下一篇: 《人人都是首席质量官》vs “人人都是产