Unity 之渲染管線初探

weixin_34378969發表於2017-03-30

Unity 是一款跨平臺的 3D 引擎,有著強大的渲染功能,並主要用於遊戲開發。

談到 Unity 的渲染功能,我們不得不提及到著色器(Shader)——3D 遊戲引擎中最重要的一個因素­,它在遊戲效果以及畫面顯示方面起到了決定性的作用。Shader 程式設計也屬於計算機圖形學中一個重要的部分。

接下來讓我們從可程式設計渲染管線來了解 Shader 程式設計。

渲染管線模型

3D 遊戲以及 3D 模型通過渲染管線來渲染到 2D 的螢幕上。渲染管線的流程是在 GPU 中進行的,它主要佔有計算機的視訊記憶體部分。渲染管線在這個過程中進行了頂點處理、面處理、光柵化、畫素處理。

1)頂點處理

大多數接觸過 3D 圖形的人都知道3D 模型是通過眾多點構成的面而展現出來的。

2231313-3cfb3c255c778712

頂點處理,是通過一系列座標系的變換,讓各個頂點通過一定的規律在攝像機前位移,最終在螢幕上對應這些頂點的過程。

2231313-3a1368fab3f53f17

首先,物體的各個頂點從自身座標系,通過世界變換矩陣處理轉換到世界座標系,再通過取景變換矩陣變換到觀察者座標系,最後通過投影變換,將頂點轉移到螢幕座標系。

有一點大家會經常忘記,在觀察者座標系轉換到投影座標系的過程中,GPU(圖形處理單元)還對材質屬性和光照屬性進行了處理。

2)面處理

三點成一面。面處理有三個部分:面的組裝、面的擷取、面的剔除。

面的組裝:模型中的三個點會組成一個三角形的面(非任意點,因為每個點都有自己的編號)。這些面,面面相接,組成了我們能看到的模型。

面的擷取:由於攝像機和人眼一樣,可視的區域是一個錐形,模型在攝像機可視範圍內可能並不是全覆蓋,也就是在攝像機外,這些在攝像機之內的部分就會被擷取。

面的剔除:為了模擬肉眼,攝像機前的物體會出現近大遠小的現象,那麼物體和物體之間會有遮擋,被遮擋的面會被剔除不處理;每個面都有法向量,所以只有在面的法向量和攝像機散射向量夾角大於90度的才會被攝像機捕捉到。

3)光柵化

光柵化,又稱之合併階段。它的主要功能是將面轉換成一幀中的畫素集合。

2231313-fda0acb24602d05c

這一階段是不可以程式設計的,它負責執行多個片段測試,包括:深度測試、alpha 測試和模板測試,程式設計師可以通過高度配置來實現想要的效果。如果通過了所有的測試,這部分顏色就會與幀緩衝儲存的顏色通過 alpha 混合函式進行合併。

4)畫素處理

這個階段將畫素區域著色,然後賦予貼圖。

2231313-5a689a96a23c4df6
(左上為3D網格模型,左下為賦予貼圖後的3D模型,右圖為貼圖)

Shader 詳解

介紹完GPU 渲染管線之後,我們再來簡單瞭解一下可程式設計著色器 Shader —— 圖形渲染裡最有趣的部分。Shader 能讓渲染的圖形展示出水面效果、火焰的熱流效果、角色的虛化效果等視覺效果。

著色器可分為頂點著色器(VertexShader)、幾何著色器(Geometry Shader)和畫素著色器(Pixel Shader)。它們從輸入的資料中取得一個元素,通過程式計算,變換為輸出資料的一個或多個元素

2231313-c37f3fd81342c282

頂點著色器輸入源為頂點,頂點包含其在自身座標系或世界座標系的位置和向量資訊,而輸出源為已通過變換和照明處理的頂點,包含其投影座標系的資訊。

幾何著色器的輸入源為一個有 n 個頂點的幾何圖元以及最多 n 個作為控制點的額外頂點,輸出源則變成 0 或多個圖元。根據效果需要,這些圖元的可能和輸入的時候不同。

畫素著色器輸入為頂點間的片段,這些片段所包含的資訊來自於對三角形頂點資訊的插值,輸出成將要寫到幀緩衝裡的顏色

結語

在遊戲中,絢麗的場景和角色是怎麼來的呢? 很簡單,紋理資料以紋理座標(UV 座標)定址的,而並非記憶體地址。通過著色器我們可以直接讀取紋理貼圖。

模型的頂點和紋理內的 UV 座標一一對應,這樣,紋理就以一定的規則貼在了模型上。

以上就是對渲染管線的簡單介紹,關於著色器語法且待下回分解。

本文作者:吳思淇(點融黑幫), 現就職於點融Social team,一個熱愛遊戲設計的web 前端程式猿一枚。

相關文章