Unity3D 遊戲貼圖(法線貼圖,漫反射貼圖,高光貼圖)

咱們都知道,一個三維場景的畫面的好壞,百分之四十取決於模型,百分之六十取決於貼圖,可見貼圖在畫面中所佔的重要性。在這裏我將列舉一些貼圖,而且初步闡述其概念,理解原理的基礎上製做貼圖,也就順手多了。
我在這裏主要列舉幾種UNITY3D中經常使用的貼圖,與你們分享,但願對你們有幫助
01
 

首先不得不說的是漫反射貼圖:
漫反射貼圖diffuse map 

 
漫反射貼圖在遊戲中表現出物體表面的反射和表面顏色。換句話說,它能夠表現出物體被光照射到而顯出的顏色和強度。咱們經過顏色和明暗來繪製一幅漫反射貼圖,在這張貼圖中,牆的磚縫中由於吸取了比較多的光線,因此比較暗,而牆磚的表面由於反射比較強,因此吸取的光線比較少。上面的這張圖能夠看出磚塊自己是灰色的,而磚塊之間的裂縫幾乎是黑色的。
刨去那些雜糅的東西,咱們只談明顯的,漫反射貼圖表現了什麼? 列舉一下,物體的固有色以及紋理,貼圖上的光影。前面的固有色和紋理咱們很容易理解,至於後面的光影,咱們再繪製漫反射貼圖的時候須要區別對待,好比咱們作一堵牆,每一塊磚都是用模型作出來的,那麼咱們就沒有必要繪製磚縫,由於這個能夠經過打燈光來實現。但是咱們若是用模型只作了一面牆,上面的磚塊是用貼圖來實現,那麼就得繪製出磚縫了。從美術的角度,磚縫出了事一條單獨的材質帶外,還有就是磚縫也是承接投影的,因此在漫反射圖上,繪製出投影也是頗有必要的,以下圖:

 


沒有什麼物體可以反射出跟照到它身上相同強度的光。所以,讓你的漫反射貼圖暗一些是一個不錯的想法。一般,光滑的面只有不多的光會散射,因此你的漫反射貼圖能夠亮一些。
漫反射貼圖應用到材質中去是直接經過DiffuseMap的。再命名規範上它一般是再文件的末尾加上「_d」來標記它是漫反射貼圖。


 
凹凸貼圖Bump maps
凸凹貼圖能夠給貼圖增長立體感。它其實並不能改變模型的形狀,而是經過影響模型表面的影子來達到凸凹效果的。再遊戲中有兩種不一樣類型的凸凹貼圖,法線貼圖(normalmap)和高度貼圖(highmap)。

Normal maps法線貼圖

 

法線貼圖定義了一個表面的傾斜度或者法線。換一種說法,他們改變了咱們所看到的表面的傾斜度。

 

法線貼圖把空間座標的參數(X,Y,Z)記錄在像素中(R,G,B),上面的範例圖就是這個意思。

有兩種製做法線貼圖的方法:
1.從三維的模型渲染出一張法線貼圖 (用高模跟低模重疊在一塊兒,把高模上的細節烘焙到低模的UV上,這裏須要低模有一個不能重疊的UV
2.轉換一張高度貼圖成爲一個法線貼圖。(是用NVIDIAPS插件來轉換一張圖成爲法線貼圖


Height maps高度貼圖



 

什麼HeightMap呢?所謂高度圖實際上就是一個2D數組。建立地形爲何須要高度圖呢?能夠這樣考慮,地形實際上就是一系列高度不一樣的網格而已,這樣數組中每一個元素的索引值恰好能夠用來定位不一樣的網格(xy),而所儲存的值就是網格的高度(z)。

咱們在這裏敘述高度圖,其實也是爲了更好的繪製法線貼圖,不少狀況下咱們的法線貼圖只能在已有的漫反射貼圖做爲素材進行繪製,這樣就是須要由一個HeightMap轉換成法線貼圖的一個過程,明白了這個原理,作起來也就能夠更好的駕馭其效果。
高度貼圖是一種黑白的圖像,它經過像素來定義模型表面的高度。越亮的地方它的高度就越高,畫面越白的地方越高,越黑的地方越低,灰色的在中間,從而表現不一樣的地形。

固然在UNITY中也是有HightMap出現的,好比在Terrain菜單中,就有導入和導出HightMap的命令。
高度貼圖一般是在圖形處理軟件中繪製的。他們一般沒有必要渲染這些,再DOOM3遊戲中高度貼圖是被轉換成法線貼圖來使用的。使用高度貼圖僅僅是爲了適應簡單的工做流程。高度貼圖一般經過
Heightmap 函數來調用到3D軟件中去的,咱們一般再文件名後面加一個"_h"來標示它。



Normal maps vs. height maps



法線貼圖和高度貼圖通常來講,Normal Map來自於Height Map。具體生成的方法以下:Height Map的每一個像素和它上面的一個像素相減,獲得一個高度差,做爲該點法線的x值;Height Map的每一個像素和它右邊的一個像素相減,獲得一個高度差,做爲該點法線的y值;1做爲該點法線的z值。推導過程以下:x方向,每一個像素和它下面的一個像素相減,獲得向量<1, 0, hb - ha>,其中ha是該像素的高度值,hb是下一行的高度值;y方向,每一個像素和它左邊的一個像素相減,獲得向量<0, 1, hc - ha>,其中ha是該像素的高度值,hb是左一列的高度值;兩個向量Cross,獲得簡單來講,就是取兩個方向的切線向量,對它們作Cross獲得該點的法線向量。

還有另一種作法,是根據每一個象素四邊的點計算,而該點象素自己不參與計算。沒有試過,不知道哪一種好一些。並且我以爲這種計算只適合於單塊的HeightMapNormalMap,像是DOOM3中的NormalMap就沒法由HeightMap計算出來了。因此最好仍是在美工建模的時候同時生成NormalMapHeightMap而不是利用HeightMap生成NormalMap
DOOM3遊戲引擎能夠把法線貼圖和高度貼圖合成在一張凸凹貼圖上。
一般咱們繪製一張具備足夠細節的高度貼圖要比創建一個足夠細節的模型而後渲染成相應的法線貼圖要實際的多。
法線和高度的凸凹貼圖能夠經過Addnormals
函數來合併到一種材質中。
毫無疑問,高度貼圖大多數遊戲引擎中出現的很少。他們只是給電腦一種方法來計算曲面法線當使用動態燈光的時候。
這說明實際上,一張高度貼圖被轉換成一張法線貼圖,以此能夠計算出相鄰兩塊不一樣高度的位置之間的傾斜面。高度貼圖永遠不能像法線貼圖這樣具備足夠的細節,這是被確定的。
很明顯只有灰度的高度貼圖並不能很好的表現應該有的細節,由於它是黑白的,RGB顏色就會遭到浪費,而且所以你只能只用256層級的強度。
相比較來言法線貼圖的每個圖像通道均可以利用到,顯而易見,法線貼圖可以更好的來表現凸凹。

 

Specular maps高光貼圖 

 


什麼是高光貼圖?
高光貼圖是用來表現當光線照射到模型表面時,其表面屬性的.(如金屬和皮膚、布、塑料反射不一樣量的光)從而區分不一樣材質.
高光貼圖再引擎中表現鏡面反射和物體表面的高光顏色。

材質的反光程度就越強。(強弱度度是指,若是將這張Specularmap去色成爲黑白圖,圖上越偏向RGB0,0,0,的部分高光越弱,越偏向RGB255,255,255的部分高光越強.)
咱們創建高光貼圖的時候,咱們使用solid value來表現普通表面的反射,而暗的地方則會給人一種侵蝕風化的反射效果。(你頭腦中要有很清晰的物件不一樣材質之間高光強弱的關係:高光最強的是那個部分,最弱的是那個部分,處在中間級別的是哪些部分.通常來講:金屬的高光>塑料>木頭>皮膚>不料,可是這個只是一個大體的分類,不要把它做爲高光的指導.有時,你處理的物件多是如上圖同樣,絕大部分都是同一類型材質的,好比布料,這時你也要當心的去分辨不一樣材料之間的高光強度的區別.切記,在這個階段必定要保持清晰的頭腦,不要急着去添加那些細節.在大的強弱關係尚未決定以前,就去添加那些細節會影響你的判斷,而最後獲得一張層次不清晰很「花」的高光.不少時候,咱們容易範這樣的毛病,就是將物件的高光處理的太過單一.
上面的貼圖有個問題,磚的表面與磚縫相比將會有比較少的反光,可是磚縫的位置其實應該幾乎是沒有反光的。(肯定好總體高光的強弱以後,就開始在高光上疊加細節:好比金屬劃痕,金屬倒角高光,鏽漬周圍的裸金屬亮點,油漬,灰塵等.這時,你會發現,若是你在Diffusemap的繪製過程當中,保留了紋理,劃痕或以上提到過的細節的圖層,你只須要將Diffusemap中的相應圖層拖曳到Specularmap中,而後根據這些細節應該反映出來的高光強度調節就能夠了.So,良好的圖層管理習慣是很是必要的.)
顏色再高光貼圖中將會用來定義高光的顏色,組成磚的材料應該是一些沙子,他們將會反射出一些微笑的具備質感的光,這些在上面的例子中已經展現了出來。(爲了豐富高光貼圖,咱們有不少方法:作局部高光的細微變化,添加紋理(這個紋理要和材質自己的紋理區分開),疊加彩色圖層(謹慎用))
高光貼圖是經過Specularmap函數調用到引擎中的,一般咱們再貼圖的後面加一個"_s"來區別它。
凸凹貼圖能夠經過高光貼圖來改進成至關漂亮的貼圖。(要記住的是,單單憑藉高光貼圖是沒法充分的表現材質特性的,只有Didffuse,Normal,和Specular三張配合才能充分的表現材質特性.)
UNITY中,高光貼圖一般放在漫反射貼圖的透明通道里,咱們是用相關的SHANDER就能夠達到高光的效果。

 
AO貼圖
Ambient Occlusiont簡稱AO貼圖,中文通常叫作環境阻塞貼圖。是一種目前次時代遊戲中經常使用的貼圖技術,不少朋友將其與全局光烘焙貼圖混淆,其實兩者本質是徹底不一樣的。
首先,咱們從簡單的AO貼圖的算法來說:
AO貼圖的計算是不受任何光線影響的,僅僅計算物體間的距離,並根據距離產生一個8位的通道。以下圖所示,計算球形物體的AO貼圖的時候,程序使每一個像素,根據物體的法線,發射出一條光,這個光碰觸到物體的時候,就會產生反饋,好比球右下方的一些像素鎖發射的光,碰觸到了旁邊的政法提,產生反饋,標記這裏附近有物體,就呈現黑色。、
而球上方的像素所發射的光,沒有碰觸到任何物體,所以標記爲白色。


 


簡單瞭解算法後,你們就明白,全局光的烘焙師模擬GI(全局光)所呈現的陰影效果,而AO貼圖時模擬模型的各個面之間的距離。兩者性質是徹底不同的。
我舉例簡單對比 AO貼圖和GI陰影貼圖的區別。
根據這個低模,右邊計算出的AO貼圖的黑白關係,是根據物體模型距離產生的,不存在任何光源效果的影響,邊緣部分等比較密集的結構,正確的產生了深色,強化了模型結構,在遊戲引擎中,與其餘通道貼圖混合,能夠提高遊戲的效果。
右邊的是全局光烘焙貼圖的效果,是用MAX的天光計算結果進行烘焙,其陰影效果是模擬天然光線下的模型光影關係,在有結構接近的區域(好比褲袋、袖口)因爲GI得光線跟蹤計算會使其弱化,符合天然界光線效果,可是不是遊戲所須要的效果。

 

在unity中,咱們有兩個地方能夠調整AO,一個是在光照貼圖渲染器中,有一個調整AO的參數,這個是確實渲染了一層AO。還有一個就是經過攝影機特效,有一個屏幕空間環境阻塞的特效screen speace ambient occlusion(SSAO).這兩個均可以實現部分的AO效果,有興趣的朋友能夠本身嘗試一下。

CUBEMAP


 


Cube map技術說到底就是用一個虛擬的立方體(cube)包圍住物體,眼睛到物體某處的向量eyevec通過反射(以該處的法線爲對稱軸),反射向量reflectvec射到立方體上,就在該立方體上得到一個紋素了(見下圖)。明顯,咱們須要一個相似天空盒般的6張紋理貼在這個虛擬的立方體上。按CUBE MAPPING原意,就是一種enviroment map,所以把周圍場景渲染到這6張紋理裏是「正統」的。也就是每次渲染時,都做一次離線渲染,分別在每一個矩形中心放置相機「拍下」場景,用FBO渲染到紋理,而後把這張紋理做爲一個cube map對象的六紋理之一。這樣即便是動態之物也能被映射到物體表面了(雖然缺點是不能映射物體自身的任何部分)。

CUBEMAP的製做方法:
http://www.cgtextures.com/content.php?action=tutorial&name=cubemaps


 

unity3d的官網上有一段代碼,叫作 Camera.RenderToCubemap
講的是怎樣把咱們的場景烘焙成cubemap,裏面附有代碼,有興趣的能夠在SCRIPT幫助文件中搜索我上一行提到的關鍵詞。
 
LIGHTMAP

什麼是烘焙? 簡單地說, 就是把物體光照的明暗信息保存到紋理上, 實時繪製時再也不進行光照計算, 而是採用預先生成的光照紋理(lightmap)來表示明暗效果. 那麼, 這樣有什麼意義呢?

好處:

因爲省去了光照計算, 能夠提升繪製速度 
對於一些過分複雜的光照(如光線追蹤, 輻射度, AO等算法), 實時計算不太現實. 若是預先計算好保存到紋理上, 這樣無疑能夠大大提升模型的光影效果 
保存下來的lightmap還能夠進行二次處理, 如作一下模糊, 讓陰影邊緣更加柔和 
固然, 缺點也是有的:

模型額外多了一層紋理, 這樣至關於增長了資源的管理成本(異步裝載, 版本控制, 文件體積等). 固然, 也能夠選擇把明暗信息寫回原紋理, 但這樣限制比較多, 如紋理座標範圍, 物體實例個數... 
模型須要隔外一層能夠展開到一張紋理平面的UV(範圍只能是[0,1], 不能重合). 若是原模型自己就是這樣, 能夠結省掉. 但對於大多數模型來講, 可能會採用WRAP/MIRROR尋址, 這隻能再作一層, 再說不能強制每一個模型只用一張紋理吧? 因此, lightmap的UV須要美術多作一層, 程序展開算法這裏不說起.... 
靜態的光影效果與對動態的光影無法很好的結合. 若是光照方向改變了的話, 靜態光影效果是沒法進行變換的. 並且對於靜態的陰影, 無法直接影響到動態的模型. 這一點, 反而影響了真實度 
確定不僅這幾點,但我暫時只想到這幾點

那麼怎麼生成lightmap呢?

最直接的辦法: 光線追蹤....(原理想一想很簡單, 按照物體定律來就能夠了)

可是光線追蹤這東西......就算用來離線生成我都嫌慢-_-

下面說的這個是利用GPU進行計算的, 跟實時光照沒什麼兩樣:

原理:

想一想實時渲染的頂點變換流程: pos * WVP以後, 頂點座標就變換到屏幕空間了[-1, 1]

若是VertexShader裏直接把紋理座標作爲變換結果輸出(注意從[0,1]變換到[-1,1]), 那麼至關於直接變換到了紋理座標系, 這時在PixelShader裏仍是像原來那樣計算光照, 輸出的結果就能夠拿來作lightmap了

靜態模型的Lightmap(光照貼圖)與Vertex-Lighting(頂點光照)之比較

一般有個誤解就是,Vertex-Lighting是一種不費的靜態模型打光手段,所以應該被做爲提高地圖運行效率和減小文件尺寸的手段。這種觀點,在這兩方面其實都有問題Lightmap使用平展開的一套UV,如同普通皮膚貼圖所需的。Lightmap的貼圖大小能夠靈活設置,好比64x64。這種方式提供了每像素的光照數據Vertex-Lighting使用的數據結構,包含每一個頂點所受光照的亮度和色彩信息。



該數據結構消耗特定量的內存,這個量是由模型的頂點數量決定的,不能隨意改變在多數狀況下,靜態模型應該設成使用Lightmap,由於這能夠產生最好的視覺效果,最好的運行效率,並且比Vertex-Lighting消耗更少的內存Lightmap和Vertex-Lighting相比較,具備以下優勢:- Lightmap能夠減小CPU和GPU的佔用- Lightmap讓CPU須要計算的光照和物體間的互動更少- Lightmap不須要在GPU的多重pass中被渲染- Lightmap pass被整合進Emissive(自發光)pass中,所以能夠縮短渲染時間- Lightmap能夠表現交錯覆蓋於靜態模型三角面上的複雜的每像素光照,然而Vertex-Lighting只能表現頂點到頂點之間線形的漸變- 使用Lightmap的靜態模型,能夠經過優化使用更少的三角形,得到額外的效率提高。

爲使用Vertex-Lighting而製做的模型,一般須要較高的細分度,得到更多的頂點來改善頂點之間的光照過渡,然而這種作法的反作用是提高了模型的三角形數量並影響運行效率- 靜態模型上的Lightmap能夠設置爲使用很小的分辨率,好比16x16或32x32,來減小內存開支。這對於遠離遊戲中心區域的靜態模型來講,很是有用,這一樣也適合受光很均勻的模型。

Vertex-Lighting就不具備這種優化的便利,它老是消耗一樣數量的內存來存放模型所有頂點的數據結構- Lightmap能夠經過調整UV的佈局,來進行優化以提供儘量好的光照質量。好比,有一個球形岩石,能夠將它的底部的三角形的UV尺寸作得很小,從而讓這部分在整個Lightmap的UV上面只佔據很小一塊,這樣,對於頂部和側面來講,就得到了更大的貼圖面積因而有更精細的光照效果。Vertex-Lighting的精度老是對應於頂點數,而效果又受模型實際大小的影響(就是說縮小了看還能夠的模型,放大好比一百倍,因爲頂點不能改變,因此效果也變糙一百倍,而Lightmap由於能夠靈活設置精度不存在這個問題),而且不能被優化若是靜態模型的三角形和頂點數量不多的話,那使用Vertex-Lighting可能會比使用Lightmap佔用更少的內存,然而,使用Lightmap絕對是看起來更好的,效率也更高的。


使用Lightmap讓LD能夠優化光照的質量和內存的佔用因此Lightmap顯然是比Vertex-Lighting更好的選擇舉個例子:好比使用UT3這遊戲的靜態模型HU_Deco_Pipes.SM.Mesh.S_HU_Deco_Pipes_SM_Pipe01該模型有2555個三角形和2393個頂點若是在場景中放置此模型的420個實例,而且都使用Vertex-Lighting,那麼總共消耗11MB內存若是在場景中放置此模型的420個實例,而且都使用32x32的Lightmap,那麼總共消耗850kb內存若是在場景中放置此模型的420個實例,而且都使用64x64的Lightmap,那麼總共消耗3.3MB內存佔用內存的量,也會在地圖文件的尺寸上有所表現這個例子中的一部分實例,其所用的Lightmap的精度,能夠設到128x128或者更高以便得到最佳的光照效果,而仍然使用相比Vertex-Lighting來講更少的內存。而且使用Lightmap的版本,要比Vertex-Lighting版本在渲染上快8-10個百分點。

 
Mipmap和detailmap

首先從MIPMAP的原理提及,它是把一張貼圖按照2的倍數進行縮小。直到1X1。把縮小的圖都存儲起來。在渲染時,根據一個像素離眼睛爲之的距離,來判斷從一個合適的圖層中取出***l顏色賦值給像素。在D3D和OGL都有相對應的API控制接口。


 


透過它的工做原理咱們能夠發現,硬件老是根據眼睛到目標的距離,來玄奇最適合當前屏幕像素分辨率的圖層。假設一張32768x32768mipmap貼圖,當前屏幕分辨率爲1024*1024。眼睛距離物體比較近時,mipmap最大也只可能從1024*1024Mipmap圖層選取***l。再次,當使用三線性過濾(trilinear)時,最大也只能訪問2048*2048的圖層選取***l,來和1024*1024圖層中的像素進行線性插值。

 







detailMAP

顧名思義,就是細節的貼圖,我這裏有一個例子,
使用前:

 

使用後:

 

使用的着色器:

 

原理上不用贅述,其實就是圖層的疊加與混合。在這裏有幾個關鍵詞,一個是DetailTiling值,一個是這個Detailmap須要在導入的時候設置爲Mipmap,裏面的參數你們能夠試着調一下,至於Mipmap的原理,已經在上面介紹了。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!但願你也加入到咱們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshowphp

相關文章
相關標籤/搜索