1. 程式人生 > >unity 貼圖

unity 貼圖

inf 因此 基礎上 tro 控制 ron lmap 導入 金屬

貼圖的英語 Map 其實包含了另一層含義就是“映射”。其功能就是把紋理通過 UV 坐標映射到3D 物體表面。貼圖包含了除了紋理以外其他很多信息,比方說 UV 坐標、貼圖輸入輸出控制等等。材質是一個數據集,主要功能就是給渲染器提供數據和光照算法。

技術分享圖片

漫反射貼圖diffuse map :漫反射貼圖在遊戲中表現出物體表面的反射和表面顏色。換句話說,它可以表現出物體被光照射到而顯出的顏色和強度。我們通過顏色和明暗來繪制一幅漫反射貼圖,在這張貼圖中,吸收了比較多的光線的部分比較暗,而表面反射比較強的部分,吸收的光線比較少。
列舉一下,物體的固有色以及紋理,貼圖上的光影。前面的固有色和紋理我們很容易理解,至於後面的光影,我們再繪制漫反射貼圖的時候需要區別對待,比如我們做一堵墻,每一塊磚都是用模型做出來的,那麽我們就沒有必要繪制磚縫,因為這個可以通過打燈光來實現。可是我們如果用模型只做了一面墻,上面的磚塊是用貼圖來實現,那麽就得繪制出磚縫了。從美術的角度,磚縫出了事一條單獨的材質帶外,還有就是磚縫也是承接投影的,所以在漫反射圖上,繪制出投影也是很有必要的。沒有什麽物體能夠反射出跟照到它身上相同強度的光。因此,讓你的漫反射貼圖暗一些是一個不錯的想法。通常,光滑的面只有很少的光會散射,所以你的漫反射貼圖可以亮一些。漫反射貼圖應用到材質中去是直接通過DiffuseMap的。再命名規範上它通常是再文件的末尾加上“_d”來標記它是漫反射貼圖。

高度貼圖Height maps:所謂高度圖實際上就是一個2D數組。創建地形為什麽需要高度圖呢?可以這樣考慮,地形實際上就是一系列高度不同的網格而已,這樣數組中每個元素的索引值剛好可以用來定位不同的網格(x,y),而所儲存的值就是網格的高度(z)。
我們在這裏敘述高度圖,其實也是為了更好的繪制法線貼圖,很多情況下我們的法線貼圖只能在已有的漫反射貼圖作為素材進行繪制,這樣就是需要由一個HeightMap轉換成法線貼圖的一個過程,明白了這個原理,做起來也就可以更好的駕馭其效果。
高度貼圖是一種黑白的圖像,它通過像素來定義模型表面的高度。越亮的地方它的高度就越高,畫面越白的地方越高,越黑的地方越低,灰色的在中間,從而表現不同的地形。使用高度貼圖僅僅是為了適應簡單的工作流程。高度貼圖通常通過“Heightmap”函數來調用到3D軟件中去的,我們通常再文件名後面加一個"_h"來標示它。

高光貼圖 Specular maps:高光貼圖是用來表現當光線照射到模型表面時,其表面屬性的.(如金屬和皮膚、布、塑料反射不同量的光)從而區分不同材質。高光貼圖在引擎中表現為鏡面反射和物體表面的高光顏色。
材質的反光程度就越強。(強弱度是指,如果將這張Specularmap去色成為黑白圖,圖上越偏向RGB0,0,0,的部分高光越弱,越偏向RGB255,255,255的部分高光越強.)
我們建立高光貼圖的時候,我們使用solid value來表現普通表面的反射,而暗的地方則會給人一種侵蝕風化的反射效果。
顏色在高光貼圖中將會用來定義高光的顏色,組成磚的材料應該是一些沙子,他們將會反射出一些微小的具有質感的光。(為了豐富高光貼圖,我們有很多方法:做局部高光的細微變化,添加紋理(這個紋理要和材質本身的紋理區分開),疊加彩色圖層(謹慎用))。高光貼圖是通過Specularmap函數調用到引擎中的,通常我們再貼圖的後面加一個"_s"來區別它。要記住的是,單單憑借高光貼圖是無法充分的表現材質特性的,只有Didffuse,Normal,和Specular三張配合才能充分的表現材質特性。

AO貼圖Ambient Occlusiont:中文一般叫做環境阻塞貼圖,是一種目前次時代遊戲中常用的貼圖技術,AO貼圖的計算是不受任何光線影響的,僅僅計算物體間的距離,並根據距離產生一個8位的通道。計算物體的AO貼圖的時候,程序使每個像素,根據物體的法線,發射出一條光,這個光碰觸到物體的時候,就會產生反饋,標記這裏附近有物體,就呈現黑色。而球上方的像素所發射的光,沒有碰觸到任何物體,因此標記為白色。簡單了解算法後,大家就明白,全局光的烘焙師模擬GI(全局光)所呈現的陰影效果,而AO貼圖時模擬模型的各個面之間的距離。二者性質是完全不一樣的。
在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對象的六紋理之一。這樣即使是動態之物也能被映射到物體表面了(雖然缺點是不能映射物體自身的任何部分)。

光照紋理LIGHTMAP:把物體光照的明暗信息保存到紋理上, 實時繪制時不再進行光照計算, 而是采用預先生成的光照紋理(lightmap)來表示明暗效果。
好處:由於省去了光照計算, 可以提高繪制速度 。對於一些過度復雜的光照(如光線追蹤, 輻射度, AO等算法), 實時計算不太現實. 如果預先計算好保存到紋理上, 這樣無疑可以大大提高模型的光影效果,保存下來的lightmap還可以進行二次處理, 如做一下模糊, 讓陰影邊緣更加柔和
缺點:模型額外多了一層紋理, 這樣相當於增加了資源的管理成本(異步裝載, 版本控制, 文件體積等). 當然, 也可以選擇把明暗信息寫回原紋理, 但這樣限制比較多, 如紋理坐標範圍, 物體實例個數。靜態的光影效果與對動態的光影沒法很好的結合. 如果光照方向改變了的話, 靜態光影效果是無法進行變換的. 而且對於靜態的陰影, 沒法直接影響到動態的模型. 這一點, 反而影響了真實度。

MIPMAP:把一張貼圖按照2的倍數進行縮小。直到1X1。把縮小的圖都存儲起來。在渲染時,根據一個像素離眼睛為之的距離,來判斷從一個合適的圖層中取出texel顏色賦值給像素。
透過它的工作原理我們可以發現,硬件總是根據眼睛到目標的距離,來選擇最適合當前屏幕像素分辨率的圖層。假設一張256x256的mipmap貼圖,當前屏幕分辨率為1024*1024。眼睛距離物體比較近時,mipmap最大也只可能從1024*1024的Mipmap圖層選取texel。再次,當使用三線性過濾(trilinear)時,最大也只能訪問2048*2048的圖層選取texel,來和1024*1024圖層中的像素進行線性插值。

detailmap:顧名思義,就是細節的貼圖,其實就是圖層的疊加與混合。在這裏有幾個關鍵詞,一個是Detail的Tiling值,一個是這個Detailmap需要在導入的時候設置為Mipmap。
法線貼圖是凸凹貼圖(Bump mapping)的一種常見應用,簡單說就是在不增加模型多邊形數量的前提下,通過渲染暗部和亮部的不同顏色深度,來為原來的貼圖和模型增加視覺細節和真實效果。簡單原理是在普通的貼圖的基礎上,再另外提供一張對應原來貼圖的,可以表示渲染濃淡的貼圖。通過將這張附加的表示表面凸凹的貼圖的因素於實際的原貼圖進行運算後,可以得到新的細節更加豐富富有立體感的渲染效果。法線貼圖多用在CG動畫的渲染以及遊戲畫面的制作上,將具有高細節的模型通過映射烘焙出法線貼圖,貼在低端模型的法線貼圖通道上,使之擁有法線貼圖的渲染效果,卻可以大大降低渲染時需要的面數和計算內容,從而達到優化動畫渲染和遊戲渲染的效果。法線貼圖就是記錄了一個需要進行光影變換的貼圖上的各個點的凹凸情況的貼圖,顯示芯片根據這個貼圖的內容,來實時的生成新的有過光影變化的貼圖,從而實現立體效果。
法線貼圖其實並不是真正的貼圖,所以也不會直接貼到物體的表面,它所起的作用就是記錄每個點上的法線的方向。所以這個貼圖如果看起來也會比較詭異,經常呈現一種偏藍紫色的樣子。
大多數法線圖一般都和下面的圖類似,是一張以藍紫色為主的圖。這張法線圖其實是一張RGB貼圖,其中紅,綠,藍三個通道分別表示由高度圖轉換而來的該點的法線指向:Nx、Ny、Nz。在其中絕大部分點的法線都指向z方向,因此圖更偏向於藍色。在shader進行處理時,我們將光照與該點的法線值進行點積後即可得到在該光線下應有的明暗特性,再將其應用到原圖上,即可反應在一定光照環境下物體的凹凸關系了。

技術分享圖片

unity 貼圖