如何充分利用 Unity Shader 為我們的遊戲增光添彩呢?

Shader入門,那人郵君一定要跟大家推薦這本《 Unity Shader 入門精要》!

這本書內容全面,結構清晰,語言通俗易懂,講解由淺入深,適合Unity初學者、遊戲開發者、程序員,也可以作為在校學生的學習用書,以及培訓學校的培訓教材。得到業界專家羅盛譽(風宇衝)和宣雨松(MOMO)的鼎力推薦~

如何充分利用 Unity Shader 為我們的遊戲增光添彩呢?

馮樂樂 著

這本書有一些獨到的特色:

(1) 內容獨特。填補了 Unity Shader 和渲染流水線之間的知識鴻溝,對 Unity 中一些渲染機制的工作原理進行詳細剖析,幫助讀者解決“是什麼”“為什麼”“怎麼做”這三個基本問題;配合大量實例,讓讀者在實踐中逐漸掌握 Unity Shader 的編寫。

(2) 結構連貫。在內容編排上頗有心思,從基礎到進階再到深入,解決讀者長期以來的學習煩惱。

(3) 充分面向初學者。書中提供了大量的圖示配合以文字說明,並在一些章節後提供了“答疑解惑”小節來解釋那些含糊不清而初學者又經常疑問的問題。

(4) 包含了 Unity 5 在渲染方面的新內容。如多次介紹 Unity 5 中的新工具幀調試器(Frame Debugger),並藉助該工具的幫助來理解Unity中的渲染過程。

(5) 補充了大量延伸閱讀資料。

在一些章節後提供了“擴展閱讀”小節,讓那些希望更加深入學習某個方向的讀者可以在提供的資料中找到更多的學習內容。


涵蓋內容

內容上,《 Unity Shader 入門精要》不僅教讀者如何使用 Unity Shader,更重要的是要幫助讀者學習 Unity 中的一些渲染機制以及如何使用 Unity Shader 實現各種自定義的渲染效果。

結構上,分為五大篇章:

一、基礎篇(1-4章):為初學者普及基本的理論知識,以及所需的數學基礎。

二、Shader初級篇(5-8章):從最簡單的 Shader 開始,講解 Shader中基礎的光照模型、紋理、和透明效果等。同時,還會介紹一些 Shader的 Debug 技巧、Shader 裡常見報錯信息。

三、Shader中級篇(9-11章):進階篇章,將講解更加複雜的光照、高級紋理、以及如何用 Shader 實現動畫等一系列進階內容;

四、Shader高級篇(12-16章):涵蓋了一些 Shader 的高級用法,如使用緩衝區、實現屏幕特效、非真實感渲染等,同時,還會介紹一些優化技巧;

五、擴展篇(17-20章):將會涵蓋一些 Unity Surface Shader 背後的機制,還會針對 Unity 5.0+ 版本中的一些新的特性進行簡要分析。最後,希望向大家介紹一點學習 Shader 的經驗和資源。

從內容編排上可以看出作者的用心。


一睹為快

以下,就書中基礎篇的“什麼是渲染流水線”以及“GPU是如何實現整個渲染流水線”的相關講解部分選摘出來,供大家學習。

===內容選摘=手動分割===


渲染流水線

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

我們可以先把渲染流程可分成3個概念性階段:應用階段幾何階段、光柵化階段

通常每個階段本身也是一個流水線系統,即包含了子流水線階段。圖中顯示了3個概念階段之間的聯繫。

如何充分利用 Unity Shader 為我們的遊戲增光添彩呢?

渲染流水線中的 3 個概念階段

應用階段:

這個階段是由應用主導的,因此通常由 CPU 負責實現,開發者在這個階段具有絕對控制權。

在這個階段,開發者主要有三個任務:

  • 首先,準備好場景數據,例如攝像機的位置、視錐體、場景中包含了那些模型、使用了哪些光源等;
  • 其次,為了提高渲染性能,我們往往需要做一個粗粒度剔除(culling)工作,以把那些不可見的物體剔除出去,這樣就不需要再移交給幾何階段進行處理;
  • 最後,我們需要設置好每個模型的渲染狀態。這些渲染狀態包含但不限於它使用的材質(漫反射顏色、高光反射顏色)、使用的紋理、使用的 Shader 等。

這一階段最重要的輸出是渲染所需的幾何信息,即渲染圖元(rendering primitives)。通俗來講,渲染圖元可以是點、線、三角面等。這些渲染圖元將被傳遞給下一階段:幾何階段。

幾何階段:

幾何階段用於處理所有和我們要繪製的幾何相關的事情。例如,決定需要繪製的圖元是什麼,怎樣繪製它們,在哪裡繪製它們。這一階段通常在 GPU上進行。

幾何階段負責和每個渲染圖元打交道,進行逐頂點、逐多邊形的操作。幾何階段的一個重要任務就是把頂點座標變換到屏幕空間中,再交給光柵器進行處理。通過對輸入的渲染圖元進行多步處理後,這一階段將會輸出屏幕空間的二維頂點座標、每個頂點對應的深度值、著色等相關信息,並傳遞給下一階段。

光柵化階段:

這一階段將會使用上個階段傳遞的數據來產生屏幕上的像素,並渲染出最終的圖像。這一階段也是在

GPU 上運行。光柵化的任務主要是決定每個渲染圖元中的哪些像素應該被繪製在屏幕上。它需要對上一個階段得到的逐頂點數據(例如紋理座標、頂點顏色等)進行插值,然後再進行逐像素處理。

區別於上述概念上的流水線,下面要介紹的GPU流水線,是硬件真正用於實現上述概念的流水線。


CPU和GPU之間的通信

渲染流水線的起點是CPU,即應用階段

應用階段可分為以下三個小階段:

(1)把數據加載到顯存中:

所有渲染所需的數據都需要從硬盤中加載到系統內存中。然後,網格和紋理等數據又被加載到顯卡的存儲空間——顯存中。

(2)設置渲染狀態:

渲染狀態通俗的解釋是,這些狀態定義了場景中的網格是怎樣被渲染的。

例如,使用哪個頂點著色器/片元著色器、光源屬性、材質等。如果我們沒有更改渲染狀態,那麼所有的網格都將使用同一種渲染狀態,如下圖顯示了當使用同一種渲染狀態時,渲染3個不同網格的結果。

如何充分利用 Unity Shader 為我們的遊戲增光添彩呢?

在同一狀態下渲染3個網格。由於沒有更改渲染狀態,因此三個網格的外觀看起來像是同一種材質的物體

準備好上述工作後,CPU會調用渲染命令 Draw Call 來告訴 GPU 開始渲染。

(3)調用 Draw Call:

當給定了一個Draw Call 時,GPU就會根據渲染狀態(例如材質、紋理、著色器等)和所有輸入的頂點數據來進行計算,最終輸出成屏幕上顯示的那些漂亮的像素。而這個過程,就是GPU 流水線。

如何充分利用 Unity Shader 為我們的遊戲增光添彩呢?

CPU 通過調用 Draw Call 來告訴 GPU 開始進行一個渲染過程


GPU 流水線

當GPU從CPU那裡得到渲染命令後,就會進行一系列流水線操作,最終把圖元渲染到屏幕上。

對於概念階段的後兩個階段——幾何階段和光柵化階段,可分成若干更小的流水線階段,如下圖所示。

如何充分利用 Unity Shader 為我們的遊戲增光添彩呢?

GPU 的渲染流水線實現

「圖中綠色表示該流水線階段是完全可編程控制的,黃色表示該流水線可以配置但不是可編程的,藍色表示該流水線階段是由 GPU 固定實現的,開發者沒有任何控制權。實線表示該 Shader 必須由開發者編程實線,虛線表示該 Shader 是可選的。」

從圖中可以看出,GPU 的渲染流水線接收頂點數據作為輸入。這些頂點數據是由應用階段加載到顯存中,再由 Draw Call 指定的。這些數據隨後被傳遞給頂點著色器。

  • 頂點著色器(Vertext Shader)是完全可編程的,它通常用於實現頂點的空間變換、頂點著色等功能。
  • 曲面細分著色器(Tessellation Shader)是一個可選的著色器,它用於細分圖元。
  • 幾何著色器(Geometry Shader)是可選的著色器,可以被用於執行逐圖元的著色操作,或者被用於產生更多的圖元。
  • 裁剪階段的目的是將不在攝像機視野內的頂點裁減掉,並剔除某些三角圖元的面片。這個階段是可配置的。
  • 幾何概念階段中的最後一個流水線階段是屏幕映射。這一階段是不可配置和編程的,它負責把每個圖元的座標轉換到屏幕座標系中。

光柵化概念階段中的三角形設置(Triangle Setup )三角形遍歷(Triangle Traversal )階段也都是固定函數(Fixed-Function)的階段。

  • 片元著色器(Fragment Shader )是完全可編程的,它用於實現逐片元(Per-Fragment)的著色操作。
  • 逐片元操作(Per-Fragment Operations )階段負責執行很多重要的操作,例如修改顏色、深度緩衝、進行混合等,它不是可編程的,但具有很高的可配置性。

最終生成我們看到的屏幕圖像。

接下來,如何充分利用 Unity Shader 為我們的遊戲增光添彩呢? Unity Shader 入門精要》有更多技巧等你揭曉

希望這本書可以為大家打開一扇新的大門,讓大家離製作心目中傑出遊戲的心願更近一步。


如何充分利用 Unity Shader 為我們的遊戲增光添彩呢?


分享到:


相關文章: