渲染流水線
渲染流水線最終目的:生成或者渲染一張二維紋理,即我們在電腦屏幕上看到的所有效果。它的輸入是一個虛擬攝像機、一些光源、一些shader以及紋理等。
渲染流程分為三個階段:應用階段,幾何階段,光柵化階段。
應用階段:
通常由CPU負責實現。是由開發者主導的。
開發者有3個主要任務:
- 準好場景數據。例如攝像機的位置、視椎體、場景裏的模型、光源等。
- 做一個粗粒度剔除工作。把那些不可見的物體剔除出去,這樣就不需要再移交給幾何階段。
- 設置好每個模型的渲染狀態。包括但不限於使用的材質(漫反射顏色、高光反射顏色)、使用的紋理、使用的Shader等。
輸出:渲染所需要的幾何信息,既渲染圖元(rendering primitives)。渲染圖元可以是點、線、三角面等。
幾何階段:
負責和每個渲染圖元打交道,進行逐頂點、逐多邊形的操作。處理所有和我們要繪制的幾何相關的事情。例如,決定需要繪制的圖元是什麽,怎樣繪制,在哪裏繪制。這一階段在GPU上進行。
一個重要任務就是把頂點坐標變化到屏幕空間中,再交給光柵器處理。
輸出:屏幕空間的二維頂點坐標、每個頂點對應的深度值、著色等相關信息。
光柵化階段:
使用上個階段傳遞來的數據產生屏幕上的像素,並渲染出最終的圖像。
光柵化的任務主要是決定每個渲染圖元中的哪些像素應該被繪制在屏幕上。需要對上一個階段得到的逐頂點數據(例如紋理坐標、頂點坐標等)進行差值。然後再進行逐像素處理。
CPU和GPU通信
應用階段大致可以分為以下3個階段:
1.把數據加載到顯存。
渲染所需的數據都要從硬盤加載到系統內存。然後,網格和紋理等數據又被加載顯卡的存儲空間——顯存中。這是因為,顯卡對於顯存的訪問速度更快,而且大多數顯卡對於系統內存沒有直接的訪問權限。
2.設置渲染狀態。
渲染狀態定義了場景中的網格是怎麽樣被渲染的。例如,使用哪個頂點著色器/片元著色器、光源屬性、材質等。
3.調用Draw Call。
DrawCall就是一個命令,CPU通過調用DrawCall來告訴GPU開始進行一個渲染過程。一個DrawCall會指向本次調用需要渲染的圖元列表。
GPU流水線
GPU渲染的過程就是GPU流水線。
圖中綠色表示該流水線階段是完全可編程控制的,黃色表示該流水線可以配置但不是可編程的,藍色表示該流水線階段是由GPU固定實現的,開發者沒有任何控制權。實線表示該Shader必須由開發者編程實線,虛線表示該Shader是可選的。
渲染流水線