【UnityShader】渲染流水線


  渲染流水線的最終目的在於生成或者說是渲染一張紋理,即我們在屏幕上看到的所有效果。它的輸入是一個虛擬攝像機、一些光源、一些Shader以及紋理等。

渲染流程概述

渲染流程分爲3個階段:應用階段、幾何階段、光柵化階段。
渲染流程

應用階段

  • 準備場景數據;
  • 粗粒度剔除,把不可見的物體剔除出去,這樣就不需要在移交給幾何階段進行處理;
  • 設置好每個模型的渲染狀態,例如使用的材質、紋理、shader等。
  • 輸出的是渲染所需要的幾何信息,即渲染圖元。渲染圖元可以是點、線、面等。

幾何階段

  • 幾何階段負責和每個渲染圖元打交道,進行逐頂點、逐多邊形的操作。
  • 幾何階段的重要任務就是把頂點座標變換到屏幕空間中,在交給光柵器進行處理。

光柵化階段

  • 光柵化階段使用上一階段傳遞的數據來產生屏幕上的像素,並渲染出最終的圖像。
  • 光柵化階段的任務主要是決定每個渲染圖元中的哪些像素應該被繪製到屏幕上,它需要對上一階段得到的逐頂點數據進行插值,然後在進行逐像素處理。

渲染具體流程

渲染流程
圖中,綠色表示該階段是完全可編程控制的,黃色表示可以配置但不是可編程的,藍色表示是由GPU固定實現的,開發者沒有控制權。實現表示該shader由開發着編程實現,虛線表示該shader是可選的。

應用階段

即CPU 和 GPU 通信階段。具體分爲三個階段

把數據加載到顯存中

  所有渲染所需的數據都需要從硬盤中加載到系統內存(RAM)中。然後,網格和紋理等數據又被加載到顯卡上的存儲空間——顯存中。這是因爲,顯卡對於顯存的訪問速度更快,而且大多數顯卡對於 RAM 沒有直接訪問權限。把數據加載到顯存中後,RAM 中的數據就可以移除了,但對於一些數據來說,CPU仍然需要訪問它們(例如,我們希望CPU可以訪問網格數據來進行碰撞檢測),那麼我們可能就不希望這些數據被移除,因爲從硬盤加載到 RAM 的過程是十分耗時的。

設置渲染狀態

  渲染狀態,通俗解釋就是,這些狀態定義了場景中的網格是怎樣被渲染的。例如,使用的shader、光源屬性、材質等。

調用 DrawCall

  CPU 調用圖像編程接口,以命令GPU進行渲染的操作。

GPU 流水線階段

即幾何和光柵化階段。

頂點着色器

  • 完全可編程;
  • 輸入來自於 CPU;
  • 主要是處理頂點,逐頂點操作,輸入進來的每個頂點都會調用一次頂點着色器。
  • 頂點着色器本身不可以創建或者銷燬任何頂點,而且無法得到頂點與頂點之間的關係。例如,我們無法得知兩個頂點是否屬於同一個三角網格。但正是因爲這樣的獨立性,GPU可以利用本身的特效並行化處理每個頂點,這意味着這一階段的處理速度會很快。
  • 主要工作:頂點變換和逐頂點光照,還可以輸出後續階段所需的數據。
  • 頂點着色器可以改變頂點的位置,這在頂點動畫中是非常有用的。
  • 必須完成的一個工作,把頂點從模型空間變換到齊次裁剪空間。把頂點座標變換到齊次裁剪座標下,再由硬件做透視除法後,最終得到歸一化的設備座標。
曲面細分着色器
  • 可選的着色器;
  • 用於細分圖元;
幾何着色器
  • 可選着色器;
  • 它可以被用於執行逐片元的着色操作或者被用於產生更多的圖元。
裁剪
  • 可配置的,但不可以編程控制,而是硬件上的固定操作,可以自定義一個裁剪操作來對這一步進行配置。
  • 一個圖元和攝像機視野的關係有3種:完全在視野內、部分在視野內、完全在視野內。將那些不在攝像機視野內的頂點裁剪掉,部分在視野內的圖元需要進行一個處理,就是裁剪。還要剔除某些三角圖元的片面。
屏幕映射
  • 不可配置和編程;
  • 這一階段輸入的座標仍然是三維座標系下的座標(範圍在單位立方體內);
  • 屏幕映射的任務是把每個圖元的 x 和 y 座標轉換到屏幕座標系中。是一個縮放的過程。
三角形設置
  • 都是固定函數階段;
  • 這個階段會計算光柵化一個三角網格所需要的信息。具體來說,上一個階段輸出的都是三角網格的頂點,即我們得到的是三角網格每條邊的兩個端點。但如果要得到整個三角網格對像素的覆蓋情況,必須計算每條邊上的像素座標。爲了能夠計算邊界像素的座標信息,就需要得到三角形邊界的表示方式。這樣一個計算三角網格表示數據的過程就叫做三角形設置。
三角形遍歷

三角形遍歷

  • 檢查每個像素是否被一個三角網格所覆蓋。如果覆蓋的話,會生成一個片元。而這樣一個找到哪些像素被三角網格覆蓋的過程就是三角形變量,也被成爲掃描變換。
  • 這一步輸出的是一個片元序列。需要注意的是,一個片元並不是真正意義上的像素,而是包含了很多狀態的集合,這些狀態用於計算每個像素的最終顏色。
片元着色器
  • 完全可編程;
  • 用於實現逐片元的着色操作;
  • 片元着色器的輸入是上一個階段對頂點信息插值得到的結果。更具體來說,是根據那些從頂點着色器重輸出的數據插值得到的。而它的輸出是一個或者多個顏色值。
  • 這一階段可以完成很多重要的渲染計算,其中最重要的技術之一就是紋理採樣。
  • 雖然片元着色器可以完成很多重要的效果,但它的侷限在於,它僅可以影響每個片元。
逐片元操作
  • 具有很高的可配置性,即我們可以設置每一步的操作細節;
  • 負責執行很多重要的操作,例如修改顏色、深度緩衝、混合等;
  • 任務
    1)決定每個片元的可見性。這涉及了很多測試工作,例如深度測試、模板測試等。
    2)如果一個片元通過了所有的測試,就需要把這個片元的顏色值和已經存儲在顏色緩衝區中的顏色進行混合。
  • 片元 --> 模板測試 --> 深度測試 --> 混合 --> 顏色緩衝區

  當模型的圖元經過了層次計算和測試後,就會顯示在屏幕上。屏幕上顯示的是顏色緩衝區中的顏色值。但是,爲了避免看到正在進行光柵化的圖元,GPU會使用雙重緩衝的策略。這意味着,對場景的渲染是在幕後發生的,即在後置緩衝中,一旦場景以及被渲染到後置緩衝中,GPU就會交換後置緩衝區和前置緩衝區中的內容,而前置緩衝區是之前顯示在屏幕上的圖像。由此,保證了我們看到的圖像總是連續的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章