相關(guān)概念
紋理
用一張圖片控制模型的外觀
具體的做法是將一張圖“黏”在模型表面籽御,逐紋素控制模型的顏色
紋理映射坐標
模型頂點在紋理中對應(yīng)的2D坐標
利用紋理展開技術(shù)可將紋理映射坐標存儲到模型的各頂點上
用(u,v)表示,稱為UV坐標
UV坐標的范圍通常會被歸一化到0~1范圍內(nèi)
單張紋理
簡單實現(xiàn)
用紋理代替物體的漫反射顏色
Porperties中聲明紋理屬性
_Specular ("Specular", Color) = (1,1,1,1)
CG代碼片中聲明匹配的變量
// 用 紋理名_ST 聲明某個紋理的屬性 (ST: scale translation)
// 縮放,平移 xy存儲的是縮放值,.zw存儲的是偏移值
float4 _MainTex_ST;
在頂點著色器中使用屬性_MainTex_ST對頂點紋理進行變換殴玛,得到紋理坐標
// 先縮放,再偏移
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
在片元著色器中,在計算漫反射時使用紋理的紋素值
// 反射率:對紋理進行采樣(被采樣紋理, 紋理坐標)得到紋素值 ,再乘以顏色得到材質(zhì)的反射率
fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;
// 環(huán)境光 : 反射率與環(huán)境光相乘得到環(huán)境光
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
// 漫反射
fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
紋理相關(guān)屬性
TextureType
為導(dǎo)入的紋理選擇類型(如法線等)
選擇正確的類型能讓Unity對紋理進行優(yōu)化
WrapMode
當紋理坐標超過0~1范圍后垄懂,如何平鋪紋理
2種模式
- Repeat:紋理不斷重復(fù)
- Clamp:截取到邊界值厘擂,形成條形結(jié)構(gòu)
FilterMode
當紋理由于變換而產(chǎn)生拉伸時,會采用哪種濾波模式
- Point:最近鄰濾波匣吊,采樣像素數(shù)只有1個(像素風(fēng)格)
- Bilinear:線性濾波,找到4個鄰近像素寸潦,對它們進行線性插值(模糊)
- Trilinear:與Bilinear類似色鸳,在mipmap間進行混合
效果(圖片質(zhì)量)提升,耗費性能增大
Generate Mip Maps
紋理縮屑:原紋理多個像素對應(yīng)到一個目標像素
使用多級漸遠紋理(mipmapping)解決
- 多級漸遠紋理
將原紋理提前用濾波處理得到很多更小的圖像命雀,形成若干層,每層毒上一層的圖像進行了降采樣
實時運行時斩箫,根據(jù)物體與攝像機的距離使用對應(yīng)的紋理(空間換時間)
MaxSize
導(dǎo)入的紋理可以非正方形吏砂,但其長寬都應(yīng)是2的冪
Format
Unity內(nèi)部用來存儲紋理的格式
紋理格式精度越高撵儿,效果越好,占用的內(nèi)存空間越大
凹凸映射
目的:用一張紋理修改模型表面的法線狐血,為模型提供更多的細節(jié)(不會真的改變模型的頂點位置)
進行凹凸映射的方法
- 高度紋理(映射):模擬表面位移统倒,得到修改后的法線值
- 法線紋理(映射):直接存儲表面法線
高度紋理
高度圖中存儲高度值,表示模型表面局部的海拔高度
顏色深淺表示:顏色越淺表面越向外凸起氛雪,顏色越深表面越向里凹
優(yōu)點:直觀
缺點:計算復(fù)雜
法線紋理
法線方向與像素值
紋理圖中存儲的是表面的法線方向?qū)?yīng)的像素值
因為法線方向(-1,1)與像素(0,1)的分量不一樣房匆,因此需要通過映射將法線方向值映射到像素值上
像素值 =(法線方向值+1)/ 2
法線紋理圖中存儲的法線方向在哪個坐標空間?
模型空間(因為模型頂點自帶的法線本身就是定義在模型空間)
切線空間:每個頂點有屬于自己的切線空間报亩,該切線空間的原點是頂點本身浴鸿,z軸是法線方向,x軸是切線方向
- 優(yōu)點:
自由度高:記錄的是相對法線信息弦追,因此可以將某個紋理應(yīng)用到另一個不同的網(wǎng)格上
UV動畫:通過移動UV坐標實現(xiàn)凹凸移動的效果
可重用
可壓縮:z方向一定為正岳链,因此可以僅存儲xy方向,經(jīng)運算得到z方向
選擇切線空間的法線紋理
實踐
在切線空間下進行光照計算
- 頂點著色器:將視角方向和光照方向從模型空間變換到切線空間
- 片元著色器:得到切線空間下的法線(紋理采樣)劲件,與切線空間下的視角方向掸哑、光照方向進行計算,得到光照結(jié)果
在世界空間下進行光照計算
- 頂點著色器:計算從切線空間到世界空間的變換矩陣
通過頂點的切線零远、副切線和法線在世界空間下的表示得到 - 片元著色器:把法線紋理中的法線防線從切線空間變換到世界空間
Unity中的法線紋理類型
將紋理類型設(shè)置為Normal map后苗分,若勾選Create from Grayscale,則會從高度圖生成法線紋理
- Bumpiness控制凹凸程度
- Filtering決定計算凹凸程度的方式:Smooth平滑牵辣,Sharp使用Sobel濾波生成法線
漸變紋理
用漸變紋理控制漫反射光照的結(jié)果
通過這種方法可以更靈活地控制光照結(jié)果
步驟
- 計算halfLambert:通過法線方向和光照方向得到
- 構(gòu)建紋理坐標
- 用紋理坐標對漸變紋理(_RampTex摔癣,一維紋理,縱軸方向顏色不變)進行采樣
- 漫反射顏色:將采樣得到的顏色與材質(zhì)顏色相乘
- 最終顏色:環(huán)境光+漫反射+高光
需將漸變紋理的WrapMode設(shè)置為Clamp模式纬向,防止在接縫處出現(xiàn)突變择浊,導(dǎo)致黑點
遮罩紋理
遮罩:保護指定區(qū)域,使其不受某些修改
步驟
-通過采樣得到遮罩紋理的紋素值
-使用其中某(幾)個通道值與某種表面屬性相乘逾条,若該通道值為0琢岩,則可以保護表面不受該屬性影響
其他遮罩紋理
可以充分利用一張紋理的RGBA四個通道來存儲不同的屬性
- R:高光反射強度
- G:邊緣光照強度
- B:高光反射的指數(shù)部分
- A:自發(fā)光強度