# 材質與燈光 有了模型之後,在3D世界中我們必須透過材質與環境給予光線,才能使物件完整展現出他的樣貌 ## 材質(Materials) - 決定Mesh的基本外觀 - 決定Mesh如何對光線做出反應 - 必要時,可以對Mesh做出變形、或產生原本沒有的部分及效果 - 在Blender中,材質系統由各種"Node"相接來完成([Node Based Materials](https://docs.blender.org/manual/en/latest/render/materials/introduction.html)) ![](https://i.imgur.com/JOfr3c3.jpg) ## 與材質混淆的名詞 - Shader:達到某種效果的node,屬於材質的一部分 - 貼圖:附加於某些node的圖片,可以用來當作基本外觀,或是產生材質的各種效果 ## 準備 - Cycles與Eevee都可以使用Node System,今天以Cycles示範為主 ![](https://i.imgur.com/P0KOpnl.png) - 將工作區切到Shading,可以看到下方有Node Editor ![](https://i.imgur.com/17qd6kw.png) - 先把左側兩個面板關閉(拖曳另外一面板角落來覆蓋) - 將3D viewport視圖模式切為render mode(按住Z) - 選擇方塊的材質屬性,以便觀察 ![](https://i.imgur.com/3F0Nk6L.png) - node editor中會顯示目前選中物件的選中材質 - 在上方工具列中,最左邊可以切換查看Object/World材質(World也會有一個材質) ![](https://i.imgur.com/R1ab2Bt.png) - 燈光架設:為了觀測材質,必須要有光來互動才看得出效果 - 把物件換為sphere以利觀看材質(可以加subdivision & 設定smooth shading) - 切回Layout工作區,將預設光源設為Area(才有方向性),並把強度改小 - 複製出兩個光源 - 幫三個光放成三角位([3-point lighting](https://en.wikipedia.org/wiki/Three-point_lighting)): Key為主色調,強度中間/Fill為陪襯色,強度最弱/Back增加立體,強度最強 ![](https://i.imgur.com/YZWtrLk.png) ![](https://i.imgur.com/HuIL1Qn.png) ![](https://i.imgur.com/8WsS9bd.png) ## Node Editor & 簡易材質示範(單色) 在blender 2.79以後,增加了一個物理真實的統一node:[Principled BSDF](https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/principled.html),我們將使用此node來完成基本材質的示範。 - Node Editor操作 - 新增node:Shift+A - 搜尋:新增時可以選擇搜尋 - 平移面板:滑鼠中鍵 - 選擇:左鍵點選或拖曳框選,亦可按住Shift來多重選取 - 刪除:選擇後按X - 連接線:按住起始端在欲相接處放開 - 斷開線:Ctrl+右鍵 斷開連結 - Node System Logic - node由左而右傳遞資訊 - 接點處的顏色會相同(黃色對黃色、綠色對綠色、紫色對紫色,而灰色皆可以) - 最終會傳到Material Output作為輸出效果 - Principled PSDF參數簡介 1. Base color:底色,類似於diffuse 2. Metallic:決定金屬(1)或非金屬(0),因為金屬幾乎不會吸收光線故有所區別 3. Roughness:粗糙度,類似於glossy 4. IOR(Index Of Refraction):折射率,每種物質的折射率不盡相同 5. Transmission:透射程度,類似於glass 6. Normal:法線圖,可以製造凹凸效果(有效降低場景面數,節省render資源) - 幾個小示範 - A.牛皮紙 ![](https://i.imgur.com/bhn6nd2.jpg) - B.陶瓷 ![](https://i.imgur.com/agMEa0G.jpg) - C.玫瑰金 ![](https://i.imgur.com/6NoyKhl.jpg) - D.寶石綠玻璃 ![](https://i.imgur.com/EvUDEtj.jpg) ## 一般化材質:使用貼圖(Textures) - 上面的簡易材質沒有用到其他外加資訊,所有值都是單一的:不論Mesh的哪個部分,都用相同的基礎色、相同的粗糙度、相同的金屬性質、相同的穿透度... - 我們可以透過各種貼圖(Textures/Texture Maps)來提供一些新的資訊:在Mesh的不同地方提供不同顏色或不同屬性、甚至是不同的凹凸程度 - 但程式並不知道貼圖的哪個pixel要對應到mesh的哪個點,我們必須透過[UV unwrapping](https://en.wikipedia.org/wiki/UV_mapping)的動作來產生這一個資訊(這個資訊就叫做UV Map) ![](https://i.imgur.com/nRh1vbt.jpg) - 範例:岩石skin的Suzanne - 下載[岩石貼圖](https://drive.google.com/file/d/1kmSEPv-T18stkYO1FEoh3tYW8J3WyXW7/view?usp=sharing) - 隱藏sphere,新增monkey,加上subdivision surface,並新增材質取名為rock ![](https://i.imgur.com/doN4arK.png) - Shift+A新增一個Image Texture,按下資料夾圖示來開啟下載之貼圖 ![](https://i.imgur.com/zIILIO4.png) - 將貼圖node的color接點連接至Principled BSDF的Base Color處 ![](https://i.imgur.com/enouu8T.jpg) 可以發現這隻猴子頭的UV資訊已經存在(Blender自動幫基礎mesh都unwrap好了) 若到Mesh Data屬性底下的UV Maps,可以看到有一個預設的uv map ![](https://i.imgur.com/ouJwbxg.jpg) 由於自己建完的模型不會有uv map,所以刪除這個uv map,我們練習如何造出這個map ![](https://i.imgur.com/RyOvOHc.png) - 切到UV Editing工作區(通常會直接進入edit mode),全選Mesh後 按下U->Smart UV project,將會依某種攤平演算法自動建立出UV map.可以發現如果再切回render mode又可以看見正常的岩石skin ![](https://i.imgur.com/GFhqIEI.jpg) ![](https://i.imgur.com/QAEgirj.jpg) - 再回到edit mode,若在UV editor上排按下Sync Selection即可看到對應攤平的樣子 ![](https://i.imgur.com/6tMx8bb.jpg) 事實上自動unwrapping的效果並不佳,拆解的結果會造成有很多斷面跟貼圖被拉扯的情形,可以按下N開啟輔助面板,在View->Display->Overlays->勾選Stretching來查看拉扯的良率(越藍越好) ![](https://i.imgur.com/y0grbBX.jpg) - 嘗試使用不同方式來拆解: 1.先標記欲拆開之邊緣(seams):進入edit mode,選擇邊後按下 Ctrl+E->Mark Seam,注意要根據Mesh的結構以及拉伸程度來mark seam 2.按下U->Unwrap重新unwrap(標記處一定會被拆開) 3.重複動作直到滿意 ![](https://i.imgur.com/eujgm7W.png) ![](https://i.imgur.com/MIaEpWG.jpg) ## 使用各種貼圖:Diffuse/Roughness/Normal maps 我們學會如何透過unwrap獲取貼圖對應Mesh的資訊,所以可以使用除了”底色材質”貼圖之外的texture來達成其他效果。 - 使用Glossiness/Roughness map來當作不同區塊反光程度不同的訊號 - 使用Normal map來當作我表面凹凸的訊號 - 使用Displacement map來當作mesh變形訊號 ![](https://i.imgur.com/GwayhoP.png) ![](https://i.imgur.com/AGeNhSO.png) ## What's next? - 自己做Texture:[texture painting](https://www.youtube.com/watch?v=JX-UwgKaPsA)、[texture baking](https://www.youtube.com/watch?v=mdcodiuIwXM) - 程序化自動生成Texture:[procedural generated textures](https://www.youtube.com/watch?v=_deRNqDcwRk) - 不只用Texture:其他node的組合