最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

從零開始獨(dú)立游戲開發(fā)學(xué)習(xí)筆記(三十八)--Unity學(xué)習(xí)筆記18-- Creative Core 2(上)

2022-05-19 01:12 作者:oyishyi  | 我要投稿

名字起的很怪,但是這一章實(shí)在太長。我不想文章總是超過 1 萬字,既不方便看,也不方便自己之后查閱。
但直接分成 (二)和(三)又有一種內(nèi)容獨(dú)立的感覺,但這兩個地方的內(nèi)容其實(shí)是連在一起的。 所以就這么分了,(上)里主講 materials,(下)里主講 shaders。

5/18 更新:我感覺這一系列學(xué)完,再加幾個 demo,我要還是學(xué)生的話可以直接入職了,東西也太多了。不愧是官方教程。

1. Shaders 和 Materials

Shaders 和 Materials 可以讓你定義一個 3D 物體的樣子:顏色,反射,物理紋理。

下載教程項目后,打開其中一個 scene,我們要做的就是做一些看起來逼真的 object,放在下圖右邊的工作臺上:

畫面中有很多指示圖標(biāo),可以在 gizmos 里調(diào)整 3D icons 的大小,但注意最好不要直接關(guān)掉。如果看到很多黃線,則可以關(guān)掉 lightProbeGroup。

1.1 探索 meshes 和渲染

shaders 和 materials 定義了如何渲染一個 mesh。因此這一節(jié)我們好好講解一下 mesh 和渲染的關(guān)系。

1.1.1 mesh 是啥?


mesh 這個詞確實(shí)很難從名字看出是個啥,中文翻譯叫網(wǎng)格體,但依舊不明所以。
不過其含義其實(shí)相當(dāng)簡單,在 Unity 中,所有被渲染出來的 object 都有一個幾何形狀,而這個形狀就叫做 mesh。

我們可以在 Unity Editor 中比較直接地看到 mesh 的存在:

  1. 選擇工具欄左邊的這個拉框(叫 draw mode 拉框),可以看到其中 shading mode 部分被設(shè)置成為 shaded。

  2. 我們將其切換成 wireframe。

現(xiàn)在你看到的就是,沒有 shaders 和 materials 的時候,這些物體的樣子。(所以之前那個模式才叫做 shaded)

1.1.2 mesh 到底是啥?


好,上面是一個比較淺顯的解釋。我們再往深一點(diǎn)探索:

  • mesh 是 GameObject 的 3D 骨架。Unity 中所有的 GameObject 都有一個 mesh,是這個物體的幾何元素。

而 shaders 和 materials 則告訴 unity 要怎樣去渲染這個 mesh(換言之,怎樣讓這個 mesh 從 3d 物體變成 2D 圖片)。

然后我們仔細(xì)觀察 mesh(用 wireframe view)。

  • 現(xiàn)在我們可以說, 1 個 mesh 就是一系列的由節(jié)點(diǎn)構(gòu)成的 2D 多邊形。這些節(jié)點(diǎn)位于 3 維空間,具有 xyz 坐標(biāo)值。

1.1.2.1 法線

但是,如果 mesh 只包含這些信息,會讓所有的 3D objects 顯得像是鉆石,我們需要有個辦法讓其看起來光滑或彎曲。
所以 mesh 還包含一個數(shù)據(jù),叫做法線,法線儲存著頂點(diǎn)方向的信息。

  • 如果所有法線都是垂直于邊緣,那么多邊形就會看起來就會像是這樣,像鉆石:

  • 法線中包含多邊形彎曲的信息,甚至是彎曲的多少。shaders 會根據(jù) mesh 上的法線信息來渲染多邊形的彎曲度,而不是改變 mesh 本身。一個球體實(shí)際上是多個多邊形構(gòu)成,但是法線讓其彎曲以顯得平滑。

讀取節(jié)點(diǎn)信息,以及法線信息,將 mesh 表面渲染出來,是 shader 的工作。

1.1.3 創(chuàng)建 mesh


unity 里有提供一些簡單的 primitive shape(就是右鍵新建就能創(chuàng)建的 cube,sphere 那些)。不過復(fù)雜的還是要去專門的建模軟件里弄。

1.1.4 mesh filter 組件和 mesh renderer 組件


選中一個非空 object,可以看到都含有 mesh filter 和 mesh renderer 這兩個組件。

mesh filter

mesh filter 組件記錄了 mesh 相關(guān)的數(shù)據(jù)信息。可以在這里切換 mesh。很多時候切換物體可以只切換 mesh 而不用創(chuàng)建新物體。

mesh renderer

mesh renderer 則是用于定義 mesh 如何被渲染。里面有很多設(shè)置,其中比較重要的是 materials,本教程之后會經(jīng)常來這里切換 materials。

1.1.5 給 mesh 添加 material


material 是一種 asset,和 shaders 一起工作,用于定義 mesh 如何被渲染。一個 material 可用于多個 meshes。

  1. 先返回 shaded view,畢竟現(xiàn)在我們不看 mesh 了。

  2. 選中場景中的一個白色蘋果,選中其子物體 AppleBody。

  3. 觀察其 Materials 屬性,是一個列表,目前 element 0 有一個 plain white 的材質(zhì)。一個 mesh 可以有多個 materials,不過本項目不講這個。

  4. 將那個 material 切換成 AppleRed。

  5. 可以在 mesh 的 inspector 里下方看到 material 的信息,可以在這里修改 material 的信息。這樣就不用專門點(diǎn)到 material 的 inspector 里去了。

1.2 探索 shaders

shader 是一個腳本,用于將包含在 materials 里的信息應(yīng)用到渲染上。每一個 shader 都是為了某個特定的 render pipeline 寫的。

因此,使用什么 shader,取決于你用的什么 render pipeline。在 unity 中,每一個模板都包含著專門為這個模板相關(guān)的 render pipeline 設(shè)計的 shader。

不同 shaders 之間差異很大,提供各種各樣不同的視覺效果。

1.2.1 shaders 的類型


總體來講,一個 shader 上的行為可以被分為兩種:fragment shading 和 vertex shading。

Fragment Shading 又稱 Pixel Shading,用于展現(xiàn) mesh 表面在 2D 畫面中呈現(xiàn)的顏色。本項目之后會講到其將如何在光照下起作用。

Vertex Shading 則作用在 vertices 上,改變其位置用于使 mesh 表面移動或變形。

注意,shader 被分為這兩種類型,僅僅是因為其起到的作用,是一種馬后炮的分類方式。實(shí)際上所有的 shader 都能夠做任何事。這只是一種根據(jù)其使用目的來分類的方式。

1.2.2 基于物理的 shaders 和渲染


隨著電腦運(yùn)算能力的增強(qiáng),和圖形技術(shù)的發(fā)展,PBR(Phsically Based Rendering) 越來越成為趨勢。PBR 模擬現(xiàn)實(shí)世界的物理法則,光照來生成各種光效,陰影等等各種效果。

在 PBR 中,光照效果和物體分離。光只包含光照的屬性,物體包含物體的屬性,包含 materials,顏色,一起一些其他真實(shí)世界屬性。當(dāng)光照在物體上時,shaders 會計算光效會產(chǎn)生的效果,顯示出來。

相比之下,非 PBR 則一般顯得不會很真實(shí),紅色就是單純的紅色,加上一丁點(diǎn)陰影或者反射等效果。

  • 但也不是說非 PBR 就不好,有些風(fēng)格化渲染就會故意用到非 PBR,比如某些 3 渲 2 的場景。

1.2.3 URP 中的 shaders


在上一篇文章中已經(jīng)提到了,我們要使用 URP,因此我們注重 URP 相關(guān)的 shaders。
本教程中(指整個 Creative Core)會講述大部分的 shaders,只有一些特殊作用以及高級效果的 shaders 不會被涉及到。

許多 shaders 里的命名包含 lit 或者 unit。lit 表示這個 shaders 會對光照產(chǎn)生反應(yīng)。unlit 則表示不會隨著光照而變化。后者一般用于特殊的藝術(shù)效果,或者優(yōu)化。

在 materials 組件里可以看到 shader,切換不同的 shader 看看效果,注意選擇在 URP 名下的:

  1. 2D -> Sprite Default Lit。專為 2D 設(shè)計的,如果用在 3D 物體上,會將其渲染成 2D 效果。因為是 lit,會根據(jù)場景中的光照改變渲染效果。

  2. Particles -> Lit, Simple Lit, Unlit。為視覺特效使用的 shaders。之后的特效的文章中會用到。

  3. Terrain -> Lit。專為 Terrrain 工具設(shè)計的。之后關(guān)于原型的文章中會用到。

  4. Baked Lit。會自動添加到 lightmap 上。之后關(guān)于光照的文章中會用到。

  5. Complex Lit,Lit,Simple Lit。一般情況下使用的 3 個 shaders。屬于 PBS(Phsically Based Shaders)。

  6. Unlit。不應(yīng)用光照效果。

本節(jié)中使用 URP/Lit,因為這個 shader 是基于物理的,materials 將會基于真實(shí)世界的屬性而變化。

1.3 管理 materials

盡管 shaders 很重要,大部分時間會花在創(chuàng)建 materials 上。

而管理 materials 則是其中相當(dāng)重要的一部分。

1.3.1 shaders 和 materials 的區(qū)別


Shader 可以很特指,也可以很廣泛。shaders 可以控制物體的顏色,或者讓 materials 來控制顏色。實(shí)際上,shaders 可以讓場景上所有的物體看起來不一樣,但卻仍有統(tǒng)一的特質(zhì)。

在我們的例子中,雖然我媽們所有物體都使用同一個 shader。但是那些由 material 提供給 shaders 的屬性(顏色和光滑度),讓每個物體看起來不一樣。

正如一開始就提到的,shaders 和 materials 一起工作。shaders 決定了一個物體能夠長得咋樣,而 materials 則決定了一個物體實(shí)際長得咋樣。

在 unity 中更換一個 material 的 shader 的時候可以看到,下面的設(shè)置會跟著變化,這就是上面這句話的解釋。

5/23 修正:

經(jīng)過評論提醒,material 并不是真的和 shader 一起工作。而是 material 會被翻譯成 shader 代碼。類似于一種封裝 shader 的高級語言。

1.3.2 修復(fù)品紅色物體錯誤


在我們的例子中,有一個檸檬看起來有問題,呈現(xiàn)這種品紅色:

每一個 material 是為了某個 shader 而寫的。很多時候,我們會遇到將某個項目的素材導(dǎo)入到另一個項目中的情況。但是很多時候,不同項目使用的 render pipeline 不一樣,因此就會產(chǎn)生這樣的錯誤。
查看這個物體的 shader,可以發(fā)現(xiàn)叫做 standard,而這并不是 URP 的 shader。因此就會出現(xiàn)這樣的品紅色,來警告使用者。

解決方式很簡單,standard 是屬于 built-in 的 render pipeline,將其換成 URP/Lit 即可。

批量修改

這里只是一個物體,但遇到多個物體的時候就不能這樣子了。教程里給的方式其實(shí)已經(jīng)比較老了,新的解決方式在之前的文章中也提到過。

1.3.3 默認(rèn)材質(zhì)


新建一個 shpere,注意此時場景上已經(jīng)有很多物體了,因此右鍵新建物體反而有些麻煩。此時可以使用 hierarchy 左上方的 + 按鈕,之前覺得這種設(shè)計多余,現(xiàn)在不覺得了。

查看這個物體的材質(zhì),這就是默認(rèn)材質(zhì),可以發(fā)現(xiàn)叫做 lit,使用的 shader 是 URP/Lit,但是所有的地方都是灰色,因為你不能編輯默認(rèn)材質(zhì)(除了使用代碼)。

1.3.4 找到你想使用的 material


實(shí)際使用過程中,materials 的存在可能很復(fù)雜,除了你自己的 materials 文件夾??赡苓€會有些 materials 存在從其他項目或者 asset store 中導(dǎo)入的 materials。

在 project window 中,其實(shí) unity 提供了一些方便的選項,如:

再仔細(xì)觀察上圖,可以發(fā)現(xiàn)搜索框里有一個 "t:Material" 字樣,其中 t 代表 type,因此照葫蘆畫瓢也可以大概知道,如果想搜索所有的腳本就應(yīng)該使用 "t:Script"。

然后我們再看下面,可以看到有 "In Packages", "In Assets" 字樣,這樣可以縮小搜索范圍。后者指的就是在你的 Assets 文件夾下搜索。

搜索還可以再次縮小,在搜索框后面加上 red。也就是 "t:Material red",還可以繼續(xù)縮小到名字里帶有 red 的 assets 文件夾里的 Material 類型的素材。

1.3.5 賦予 material


當(dāng)然,這很簡單,但是有四種方式你知道嗎?

  1. 直接拖到物體上(scene 或者 hierarchy)。

  2. 拖到 mesh renderer 的 Materials 屬性里。

  3. 在 Materials 屬性中使用 object selector(那個圓圈)。

  4. 找到一個已經(jīng)有某個材質(zhì)的物體中,將其材質(zhì)組件拖到其他物體上。

一個材質(zhì)多個物體

同一個材質(zhì)可以給予多個物體,并且因為材質(zhì)是個 asset(多次提到,很重要)。因此在改變材質(zhì)的時候,會同時改變所有帶有這個材質(zhì)的物體的外觀。不只是當(dāng)前 scene,所有 scene 都會受到改變,因此改變的時候要好好想想。

也因此,管理 materials 是很重要的課題。

1.3.6 更改材質(zhì)


  1. 選中剛剛我們創(chuàng)建的球體。

  2. 找到 base map 屬性,更改顏色,可以看到其他使用該材質(zhì)的球體的顏色也跟著一起更改。

1.3.7 找到材質(zhì) asset


現(xiàn)在,我們換了顏色,這個 material 的名字還叫 Applered,這已經(jīng)不合適了,我們想改名。

之前我們都是在 inspector 里使用 material。但是 material 畢竟是 asset,我們其實(shí)可以在 project window 里找到。

  1. 在 Material Renderer 里的 Material 屬性,點(diǎn)一下可以定位到 folder 里的 material。

  2. 直接改名即可,不會失去引用。

1.2.8 創(chuàng)建新 material


  1. 復(fù)制一個剛創(chuàng)建的球體。

  2. 在 materials 文件夾里創(chuàng)建一個新的 material。

  3. 選個顏色,給到新的球體上。

1.2.9 復(fù)制 material


除了新建一個新的 material,另一個方便的辦法就是直接復(fù)制現(xiàn)有的 material,然后稍加修改。

  1. 復(fù)制新的球體。

  2. 復(fù)制 material。

  3. 賦到球體上,修改顏色。

這樣就比較輕松了,比起創(chuàng)建一個新的,步驟少很多。

1.3 模擬純色表面

為了創(chuàng)建類似于顯示物體表面的 material,最好還是要了解一些光線的基本原理,以及它如何在物體上起作用的。

1.3.1 光線的行為


當(dāng)光與物體接觸的時候,會可能發(fā)生以下三件事:

  1. 反射。

  2. 穿透。(如果物體有透明度)

  3. 被吸收。

人類眼睛觀察物體的時候,取決于物體是如何與光線這 3 個作用交互的。我們將會用上一步創(chuàng)建的球體(蘋果)來描述這 3 種現(xiàn)象,以及 unity 是如何模擬這 3 種現(xiàn)象的。

1.3.2 鏡面反射和漫反射(specular reflections & diffuse reflections)


先講反射。光線在物體上的反射可以分為兩種:鏡面反射和漫反射。

鏡面反射是閃亮物體上最明顯的直接反射,在下圖中,白色的箭頭就是鏡面反射,表示光線本身也是白色:

但不是所有的光都是直接照到表面,然后直接反射回來。有的光線會穿透表面,或者在表面凹凸處反射好幾次,然后被吸收或者反彈回去。這些往外逸出的光就是漫反射。

一個物體的漫反射,決定了它的可見色。蘋果的紅色光以外的光被吸收,只反射紅色光。(鏡面反射呈現(xiàn)白色,因為它反射所有的光)

鏡面反射和漫反射構(gòu)成了物體表面的所有反射,反射只能是鏡面反射或者漫反射。

1.3.3 漫反射:base map


現(xiàn)在,我們知道了,物體的顏色其實(shí)就是其漫反射的光的顏色。

在 URP/Lit shader 中,base map 表示的就是這個漫反射的顏色。不過在很多其他的 shader 中,這個叫做 Albedo 或者 Diffuse Map。(盡管從技術(shù)上來說,這些屬性還是有區(qū)別的)

Albedo

上面出現(xiàn)了一個奇怪的單詞,Albedo。Albedo(反照率) 是一個天文屬于,是用于衡量漫反射的物理值。通常是一個指定顏色,由 RGB 構(gòu)成(也可轉(zhuǎn)換為 HSL 模式)。Albedo 顏色的亮度(L)取決于漫反射的數(shù)量,色調(diào)(H)和飽和度(S)則表示從物體表面逃逸出的光的質(zhì)量。

為什么叫 base map

base 還能理解,尤其是這個 map 不是很懂。

之后我們會仔細(xì)講解 mApping。不過 Maps 可以是純色,也可以是 2D 圖片用于增加表面的變化。但 base map 里使用 color picker 選擇的顏色,僅僅只是純色。

1.3.4 Specular Workflow 中的金屬


講完了漫反射,現(xiàn)在來講鏡面反射。

對于金屬而言,比起漫反射,鏡面反射更多。

假如上面的蘋果變成鏡面反射的話,蘋果將不會有任何紅色,而只會有反射的光源的顏色,你也可以在鏡面表面上直接看到光源。

這個讓表面看起來像金屬的屬性叫做 Specularity。(或者說能看到反射的光源的程度)

如果你可以從物體上看到其反射的光源,那就可以稱其為鏡面。一些無色的金屬,如銀,鋼鐵,我們看到的顏色其實(shí)就是光源的顏色。

Specularity 和 Smoothness 的區(qū)別(后面光滑度部分有更詳細(xì)的講解)

從屬性上來說沒有任何關(guān)系。你可以讓一個蘋果變得極其光滑,但是完全可以沒有任何反射效果。
不過,從實(shí)際上來說,一個光滑的物體,最好還是有點(diǎn)鏡面反射,看起來才不違和。

以下是一堆蘋果,smoothness 都一樣,但是 specularity 逐漸增大:

和漫反射表面一樣,金屬表面一樣會吸收光。比如說你把一塊金屬放在太陽底下,它就會變熱。

不過在一些有色金屬上,如黃金,銅。其顏色并非來自漫反射光,而是著色后的鏡面反射光。這個顏色來源于金屬吸收了可見光譜上的部分光,只反射剩余的部分的光。

Specular workflow

Specularity 是一種表示物體表面看起來有多像金屬的屬性。Unity 中有兩個 workflow 來表示物體如何像金屬。

其中一種是 Specular workflow:

在這個工作流中:

  • 一個閃亮的金屬,有著高 specularity,高光滑度。

  • 一個閃亮的非金屬,有著低 specularity,高光滑度。

  • 光滑度控制著鏡面反射的焦點(diǎn)。而 Specular Map 則控制著鏡面反射的數(shù)量和顏色。

  • Specular Map 可以使用 RGB(乍一看比較奇怪為什么要在專門提這個,這主要是和后面的 metallic workflow 進(jìn)行比較)。

然后我們在 unity 里使用這個 workflow:

  1. 調(diào)整 workflow mode 為 specular。

  2. 調(diào)整 smoothness 從 0 到 1.

  3. 將 specular map 顏色調(diào)整為白色,此時物體和鏡子一樣,沒有自己的顏色,只顯示反射的顏色。(調(diào)整顏色,實(shí)際上就是調(diào)整物體會吸收哪些顏色的光)(即是說,顏色越接近白色,specularity 越高)(此外,隨著顏色逐漸變白,你會發(fā)現(xiàn)漫反射顏色,也就是 base map 的顏色逐漸被忽略)

  4. 多多調(diào)整 specular map 的顏色,會發(fā)現(xiàn)顏色特別的神奇。這是因為要時刻想到,現(xiàn)在的顏色是 base map 和 specular map 同時起作用的結(jié)果。(但是仔細(xì)想想,這也并不是非現(xiàn)實(shí)的。試想一下在藍(lán)色光源下的紅色汽車,實(shí)際上這些顏色是非常正常的)

1.3.5 metalic workflow 中的金屬


另一種 workflow 是 metalic。這種方式比較簡單方便,但是并不完全符合物理世界的規(guī)則。

在這個工作流中:

  • 一個閃亮的金屬,有著高 metallic map 值和高光滑度。

  • 一個閃亮的非金屬,有著低 metallic map 值和高光滑度

  • 光滑度控制著鏡面反射的焦點(diǎn)。

  • metallic map 僅僅只能控制灰度。(對比 specular map 可以控制 RGB 3 通道)

兩個工作流的對比

可以很明顯看出,specular 工作流能夠控制的東西更多,更加復(fù)雜。

  • 在 metallic workflow 中,base map 并不嚴(yán)格等于漫反射顏色。無論怎么調(diào)節(jié) metallic map 值,顏色依舊保持。對比之下,在 specular worklflow 中,金屬度最低的時候(specular map 白色),base map 的顏色就消失了。

  • metallic map 只有一個滑塊,控制著灰度值。對比之下,specular map 可以有 RGB 3 個通道。

兩種選擇各有優(yōu)缺點(diǎn)。metallic 工作流比較簡單,但不太符合物理現(xiàn)實(shí)。specular 的顏色控制比較復(fù)雜,但是符合現(xiàn)實(shí)物理效果。

1.3.6 光滑度(smoothness)


觀察一下真實(shí)世界的純色物體:紙張,塑料等??纯此鼈兊母吖?,是聚焦的還是模糊的?能夠從反射中看到光源嗎?你能從中得到光滑度和粗糙度嗎?

如果反射是模糊的高光,說明其比較粗糙。如果能夠很清楚地看到反射的光源,說明其比較光滑。

但注意,光滑度會增加鏡面反射率。不過并不一定像金屬。

Smoothness 和 Specularity 的對比

對比一下不同設(shè)置,以方便理解:

從人眼來看:

  • (左圖)一個高 Smoothness ,低 Specularity 的東西??雌饋矸浅9饣?,有高光。但就是看不出來反射了個啥。像個陶瓷。

  • (右圖)一個低 Smoothness,高 Specularity 的東西。你能模糊地看到反射的東西,也許你看不到細(xì)節(jié),但你大概知道輪廓。而且可以肯定這是個金屬。

結(jié)合理論來看:

  • 左圖意味著,所有的反射都是鏡面反射,但是反射的數(shù)量極少,大部分光線都被吸收了。

  • 右圖意味著,不怎么吸收光線,如實(shí)地反射光源的信息,但是漫反射居多,不清晰。

也就是說:

  • Smoothness 決定了是鏡面反射,還是漫反射。

  • Specularity 決定了鏡面反射光線的顏色(哪部分)和亮度(多少)。

1.4 給 material 添加 texture

前面講的內(nèi)容基于一個事實(shí)--物體為純色。但實(shí)際上,大多數(shù)情況下,物體并不會是純色,而是有各種花紋,或者痕跡啥的。

對于大多數(shù)物體來說,光滑度和反射度并不是平均分布的。這就是 Maps(貼圖) 的用武之地了,Maps 是包裹住 GameObject 的 2D 圖像,就像一張紙一樣。Maps 可用于設(shè)置顏色,鏡面,金屬度,物體材質(zhì),等各種屬性。包含 maps 的 2D 圖像文件就叫做 texture(紋理)。

1.4.1 texture 是啥?


如果經(jīng)常接觸 3D 作品,即使只是看看評論區(qū)和彈幕,想必也經(jīng)常聽到類似紋理材質(zhì)建模各種概念術(shù)語。那么 texture 到底是個啥呢?

首先我們要知道,texture 本身就只是一個普普通通的圖片文件,像是 jpg,png,tif,BMP 等格式。并不是像是 material 等有專門的的后綴區(qū)分。

如果有一些基礎(chǔ)的圖像知識,應(yīng)該也會知道圖像或者是單通道(greyscale),或者三通道(RGB,HSL 等),部分圖像可能會再多一個 Alpha 通道。以 texture 的作用來講,這些信息就已經(jīng)足夠了,無需再為其創(chuàng)建一個新的格式了。本來,texture 的定義就是一個圖片。

(如果你還記得的話,前面用到的 base map 和 specular map,其實(shí)就是一個 color picker,這便是一個 3 通道的圖片?;蛘哳愃朴?metallic map 這種單通道的 greyscale)

materials 會使用這些通道的數(shù)據(jù),來計算出一些屬性,像是光滑度,鏡面度等等。

texture 文件的來源

雖然 texture 文件本身只是圖片,任何能產(chǎn)出圖片的地方都可以成為來源。但是一般來說為了達(dá)到想要的紋理效果,還是會有專門的生產(chǎn)軟件。藝術(shù)家往往會在 3D DCC 中隨著模型一起導(dǎo)出來。當(dāng) texture 和 mesh 被導(dǎo)入進(jìn) unity 之后,就會使用 texture 來生成 materials。

在 unity 的 texture 文件,可以在 project window 里直接雙擊,會用默認(rèn)圖片查看器打開。

1.4.2 更換 base map texture


注意 base map texture 不是 base map,是 base map 左邊的那個框框(見下面的 gif 圖)。

base map texture(或者說 diffuse texture,Albedo texture)是一個普通的 2D 圖片,使用其 RGB(A) 信息來定義物體的漫反射,或者說就是顏色。

賦予 base map texture 后還可以調(diào)整 base map 來改變顏色。不過一般來說都是白色,來表示 texture 本身的顏色。

1.4.3 平鋪紋理(tiled texture)


有些紋理設(shè)計成用于平鋪在任何 mesh 上。在很多時候還能看到無縫紋理,這種紋理在不同 tile 之間不會有縫隙偏差。

在 unity 中有兩個設(shè)置可以調(diào)整平鋪,tiling 和 offset:

  • tiling 表示密度。越高,紋理就越密集。

  • offset 就是紋理的偏移,0.5 表示一半的紋理長度(或?qū)挾龋?/p>

1.4.4 UV 貼圖紋理(UV MApped Texture)


對于球體,方塊這種,比較簡單的物體,紋理的位置其實(shí)并不重要。邊緣和表面紋理是一樣的,紋理的移動不會有什么觀感上的影響。

但是對于像是人體這種復(fù)雜的物體,衣服上的紋理,就很重要了。比如說示例項目,點(diǎn)進(jìn)去看會發(fā)現(xiàn)整個衣服都是同一個 texture 文件。

可是它怎么知道的每個位置對應(yīng)在哪里呢?

texture 是怎么包裹 mesh 的

當(dāng)你在 3D DCC 里創(chuàng)建模型的時候,軟件會使用一個叫做?UV 映射的技術(shù)來生成 texture。

由 DCC 創(chuàng)建的 mesh,會生成一套 UV 坐標(biāo)數(shù)據(jù)。UV 是一個 2D 坐標(biāo)系的坐標(biāo)。之所以叫做 UV,是為了和 XYZ 坐標(biāo)系區(qū)分開來。UV 的坐標(biāo)和 3D 空間無關(guān),是相對于 mesh 的坐標(biāo)。

UV 映射

UV 映射過程,是首先將 3D 模型展開成一個 2D 表面,然后再映射成 2D 紋理貼圖。模型軟件會生成 UV 坐標(biāo),等到使用的時候,會從模型的頂點(diǎn)信息中讀取 UV 坐標(biāo),然后去紋理貼圖上去找,以此就能夠復(fù)現(xiàn)模型的外觀。

submesh

查看一下我們的人物模型,可以看到有很多個 materials。但是 mesh 只有一個。這就很奇怪,我們整個人物明明只使用一個 texture,卻有多個 material,而且看起來每一個 material 都對應(yīng)不同的部位。

那這就要引出 submesh 的概念了,每一個 submesh 對應(yīng)初始 mesh 的一部分。而 unity 會根據(jù) materials 來區(qū)分 submesh。有幾個 material 就有幾個 submesh,且 submesh 的部分就是這個 material 對應(yīng)的頂點(diǎn)構(gòu)成的部分。

回到 UV 映射,由于映射的存在,我們就可以避免生成多個 meshes。不然就要給領(lǐng)結(jié)做一個 mesh,衣服做一個 mesh,頭發(fā)做一個 mesh,balabala

1.4.5 使用 texture 改變反射特性


現(xiàn)在我們來看下一個 texture,metallic map 左邊的 texture。

目前我們可以看到是一個黑白色的圖片,不過在這之前我們可以先試著調(diào)整一下 smoothness,我們會發(fā)現(xiàn),只有外衣的部分會隨著調(diào)整。襯衣的光滑度并不會有任何變化,其他地方甚至?xí)泄饣炔町悾行└淖儽容^大,有些比較小。這是怎么做到的?

首先黑白的理解很簡單,因為這個用的是 metallic workflow,因此 metallic map 就是 greyscale 圖。當(dāng)然,圖片本身是有 RGB 通道的,不過 metallic map 屬性只讀取 R 通道。

至于 smoothness 則是讀取這個 texture 中的 A 通道。

注:剛才說的調(diào)整 smoothness 調(diào)整會影響光滑度變化,但不會影響像不像金屬,那個是由 metallic map 來決定的。簡而言之,對于 metallic workflow 而言,金屬度只由這個 texture 的 R 通道來決定。光滑度則由這個 texture 的 A 通道,以及滑塊共同決定。(舉一反三,如果是 specular workflow,那金屬度就是由 RGB 控制,光滑度依舊是 A 來控制)

這也是為什么剛才光滑度滑塊拖動,會造成不同地方發(fā)生有差異的變化。因為不同地方的 texture 的 A 通道值不同。襯衣部分的 Alpha 值太低了,因此滑塊的影響不大。

1.5 創(chuàng)建半透明和透明效果

1.5.1 創(chuàng)建透明的玻璃瓶


  1. 選取示例項目中的一個玻璃瓶樣的 mesh。

  2. 賦予一個新的 material,然后將 Surface Type 改成 transparent。

  3. 此時已經(jīng)可以看到有一點(diǎn)效果了,現(xiàn)在看起來的樣子,就像是前半部分被削掉一樣。這是因為我們設(shè)置了 Render Face 為 front。這會導(dǎo)致面向玩家的部分不被渲染,以便玩家看到里面的部分。

  4. 這個設(shè)置是為了游玩體驗,而且主要用在不透明的物體中。這里我們畢竟創(chuàng)造的是一個透明物體,因此這里直接設(shè)置成 both 即可,這樣就可以看到整個物體表面。

  5. 不過,設(shè)置完之后,還是很違和。并不像是透明,而是我們有了透視眼一樣。物體表面不是透明的,但我們可以看到里面的東西。

  6. 因此我們?nèi)?base map 里,調(diào)整 alpha 通道值即可。

  7. 調(diào)整 smoothness 為 1,metallic 為 0,這個時候效果就已經(jīng)很好了。但是我們其實(shí)可以稍微提高一點(diǎn) metallic 值,因為我們需要玻璃有一點(diǎn)點(diǎn)反射效果。(正如現(xiàn)實(shí)中,可以從玻璃中看到反射的自己一樣)

1.5.2 使用 alpha-cliping 創(chuàng)建物體細(xì)節(jié)


像是葉子這種物體,也許你會想讓藝術(shù)家創(chuàng)建一個葉子形狀的建模。但問題是,場景中可能會有幾萬個葉子,如果都是用這種建模,將會花費(fèi)超多的性能。因此實(shí)際上我們會用簡單的模型加上 alpha-cliping 來代替。
看一下示例項目中的葉子,一開始長啥樣?

都是些紙片,然后我們將其剪切成葉子的形狀。使用 alpha 通道讓部分形狀不可見??梢怨?jié)省相當(dāng)多的性能消耗。

  1. 和之前一樣,新建一個 material,賦給所有的葉子。

  2. 發(fā)現(xiàn)一個奇怪的現(xiàn)象,當(dāng)攝像頭從下往上看的時候,葉子都不見了。仔細(xì)想想這是為什么?之前講過的。

  3. 實(shí)際上,就是剛剛提到的 render face。我們將其改成 both 即可,葉子只有一面,因此從下面看就相當(dāng)于消失了。(有沒有發(fā)現(xiàn),只要改其中一個的 render face,所有葉子都變化了?這是當(dāng)然的,render face 是屬于 material 的屬性,而這些葉子共用同一個 material)

  4. 將準(zhǔn)備好的 texture 賦到葉子上,可以看到一部分被上色了,現(xiàn)在就像是葉子圖案被打印在紙上一樣,如下圖。

  5. 打開 alpha clipping,調(diào)整滑塊到適當(dāng)?shù)闹怠_@個值代表著當(dāng)值低于多少的時候會被裁剪掉。

1.6 凹凸貼圖(bump maps)

unity 中對凹凸貼圖的定義和其他地方用的有點(diǎn)不一樣。
unity 把凹凸貼圖分為法線貼圖(normal maps)和高度貼圖(height maps)。
但實(shí)際上,在其他地方,高度圖和凹凸貼圖是一個意思。法線貼圖就是法線貼圖,并不屬于凹凸貼圖的一類。

1.6.1 什么是凹凸貼圖和法線貼圖


這里還是不用 unity 自己的命名法則,用大家所接受的命名來比較好。

之前我們使用 base map ,specular map 和 smoothness map 來給物體添加顏色,金屬度和光滑度。
但是,假使物體表面有很多小石子,或者一些刀痕啊,之類的細(xì)節(jié)。首先如果我們只是在 base map 上添加小石子及其陰影,確實(shí)看起來有點(diǎn)像,但很容易穿幫,這也是很多低成本游戲的樣子。
我們不可能專門為這些東西建模,不然性能影響太大了。(當(dāng)然,虛幻 5 解決的就是這個問題,讓我們可以建高模直接導(dǎo)入,無需法線。不過,我們用的是 unity,我也不太清楚虛幻 5 到底是咋樣的)

此時,凹凸貼圖和(或)法線貼圖起作用的地方就到了:

  • 之前我們提到過法線,那時指的是 mesh 中頂點(diǎn)的法線,那時已經(jīng)可以讓表面彎曲了,但是想要表示細(xì)節(jié)是不夠的。而法線貼圖則是在整個表面上賦予法線,這樣就會造成表面上凹凸細(xì)節(jié)的假象。

  • 而高度貼圖就比較簡單,是一個灰度圖,表示表面每一點(diǎn)的高度,低于 50% 灰度就是凹下去,高于就是凸起來。通過這種方式來表示凹凸細(xì)節(jié)。

這兩個貼圖都可以增加表面細(xì)節(jié),而不會消耗過多的性能。但一般來說,都是僅使用法線貼圖。

1.6.2 添加法線貼圖


和別的貼圖一樣,法線貼圖也是在 3D DCC 里制作的。

還是和別的貼圖一樣,法線貼圖也是個圖片。具有 RGB 通道。RGB 分別代表不同的方向。這也是為什么法線貼圖一般都是青紫色,因為 B 通道方向的法線大多數(shù)情況下都是最多的。

在示例項目中,對比一下有無法線貼圖的衣服:

  • 無法線貼圖:

  • 有法線貼圖:

可以看到,無法線貼圖,手肘處即使有褶皺的貼圖,但看起來完全不如有法線貼圖的樣子。
至于襯衣的痕跡就更明顯了。

1.6.3 高度貼圖


高度貼圖是一個灰度圖,如果使用 RGB 通道,只會讀取 green 通道。灰度代表高度,低于 50% 灰度就是凹下去,高于就是凸起來。

相較法線貼圖而言,高度貼圖用的不多。一般用于一些特殊效果。不過由于高度貼圖會拉伸 base map,如果 base map 不是純色,最好小心點(diǎn)用。

1.7 其他 texture 類型

除了剛剛講的,還有許多其他 texture 類型同樣會起到重要作用。

1.7.1 occulsion maps(遮擋貼圖)


遮擋,指的是物體對于光線的遮擋。

即使是在 PBR 中,環(huán)境光在陰影上的表現(xiàn)依舊非常奇怪,因此我們需要使用遮擋貼圖的幫助來使得這部分陰影展現(xiàn)更好的效果。遮擋貼圖的效果不能說是非常明顯,但會提高細(xì)節(jié)的真實(shí)度。

occlusion maps 也是灰度圖。

1.7.2 更細(xì)節(jié)的表面


如果還想要更加細(xì)節(jié)的表面,例如指紋,人臉的毛孔。則可以使用 detail input 里的屬性:

這里的 normal map 和 surface input 里的 normal map 一起創(chuàng)建出復(fù)雜的細(xì)節(jié)。
此外,還有兩個屬性:

  • base map 可以添加細(xì)節(jié)的顏色,例如毛衣的線。

  • mask 則是一個 alpha 通道的圖像,則用于指定部分區(qū)域不使用 base map 和 normal map 的效果(專指 detail inputs 里得)

1.7.3 emission maps(自發(fā)光貼圖)


有一些 emissive material 會自己發(fā)光。而 emission maps 就是用于定義表面的哪些地方會發(fā)光。

我們再來看一下示例項目中主角的 emission map:

整個圖像是一片黑色,只有 3 個青色光點(diǎn)。

然后我們再看人物,身上有這么 3 個光源:

當(dāng)然,很明顯,就是這 3 個光源。

  • 我們可以關(guān)閉 emission 屬性??梢院苊黠@看到顏色變得非常暗淡。

  • 貼圖上的顏色會影響光的顏色,此外 HDR 選項會讓這些被影響的部分(也就是非黑色的部分)發(fā)額外的光。

  • HDR 也就是高動態(tài)范圍,會讓這部分發(fā)出超出一般范圍的亮度,造成強(qiáng)烈的發(fā)光效果。HDR 的 color picker 下邊有一個調(diào)整亮度的地方(見下圖右邊)


從零開始獨(dú)立游戲開發(fā)學(xué)習(xí)筆記(三十八)--Unity學(xué)習(xí)筆記18-- Creative Core 2(上)的評論 (共 條)

分享到微博請遵守國家法律
洮南市| 城口县| 牟定县| 安陆市| 茶陵县| 神农架林区| 宜宾县| 北海市| 乃东县| 晋城| 定兴县| 永顺县| 田林县| 广水市| 茂名市| 炉霍县| 衡阳县| 铜川市| 昭平县| 收藏| 新巴尔虎右旗| 中山市| 辰溪县| 杭锦后旗| 梅州市| 闻喜县| 读书| 海宁市| 乌拉特前旗| 德州市| 富源县| 丰台区| 萍乡市| 宜良县| 盐源县| 响水县| 金寨县| 灵山县| 扶余县| 古田县| 屏南县|