[Unity] 從零開始的學習心得 #5 – Mesh 與 Material

unity-learning-totally-review-5

此篇文章是《從零開始的 Unity 學習心得》系列的第五篇文章,這個系列是記錄我對 Unity 的開發及學習心得,包含我用何種方式去理解 Unity 的運作,並且在我所知的範圍內盡可能說明相關原理與開發要點。完整系列的目錄可以參考:

3D物件的組成與繪製

前幾篇文章有提過,遊戲畫面是將場景上排列佈置好的物件,動態即時的繪製成一張張的靜態畫面,像播放電影一般持續將新的畫面一幀幀展示在玩家面前。

而現在單獨考慮一個3D物件在場景中如何被繪製出來,成為遊戲畫面上的一部分。

一個3D物件的呈現,主要由 Mesh 與 Material 兩個部分:

  • Mesh 是作為物件"外型"的基本框架,一般較複雜的物件會在Unity外用專門的建模軟體進行建構,然後才匯入到 Unity 中使用。
  • Material 是作為物件"上色"方式的設定,可能包含一張或多張的貼圖(也可以沒貼圖),以及一份 Shader 程式。

相關組件(Component)

在場景中為了顯示一個3D的物件,需要在 GameObject 上掛有 MeshFilter 與 Renderer。

  • MeshFilter 用來儲存Mesh的關聯
  • Renderer 用來設定一個或數個的 Material,讓實際繪製物件時,可以呈現不同的樣貌或效果。

其中Renderer通常會使用經過繼承,有增加一些不同特性的 Mesh Renderer 或者 Skinned Mesh Renderer。

補充:
其實更深入來說,在遊戲中呈現出來的不論是3D或2D,甚至是文字,繪製的過程都會經過 Mesh 跟 Material 的環節,只是這一部分由遊戲引擎處理過了,所以使用相關組件時不一定會注意到Mesh的存在。

Mesh

打開 Unity 用來儲存 Mesh 資料的結構,可以看到許多不同的成員參數:

https://docs.unity3d.com/ScriptReference/Mesh.html

其中最為重要的,是稱為 verticestriangles 的兩份陣列資料,是用在渲染管線(Rendering Pipeline)中的基本渲染單位。

  • Vertex(頂點),如其名是Mesh用在形成多邊形的頂點,儲存在 vertices 中的是許多的座標資料。
  • Triangle(三角面),triangles 內部儲存的是 Vertices 陣列的 Index,每三個為一組,將 Vertex 連結為三角形,確立多邊形的外觀。

除了上述兩份資料,還可以看到 normalscolorsuv 等陣列資料,這些雖然不是渲染管線必要的資料,但是大部分的 Material 都會用到這些資訊,Unity作為遊戲引擎會預設將這些資料傳遞到Material中備用。

Material

Material 可以在 Unity 中的 Project 視窗中新增,然後切換使用的 Shader,以及進行細節的設定;也可以利用腳本在遊戲執行時即時建立新的 Material。

可以將 Material 想成是一種特別設定的筆刷,用來為 Mesh 上色為想要的樣貌。包括物件的基本顏色、光照與陰影,都跟 Material 的設定有關。

在程式的角度來理解,Material 是基於一份 Shader 配製成的渲染邏輯。同樣一份 Shader 搭配不同的貼圖或設定,則會產生一些渲染結果上的差異,而這個 Shader 與特定的設定組合,便被稱為一份 Material。

Material中文被一般稱為"材質"、“材質球”。

文章最後

到這邊為止,可能還很難建立起關於 Mesh 與 Material 的詳細輪廓,事實上這些都只是遊戲引擎為了方便開發而建立的儲存結構,等到進一步了解渲染管線(Rendering Pipeline),其間的互動方式才會真的被解明。