Unity 基础纹理
第七章 基礎紋理
導言
在OpenGL里,紋理空間的原點位于左下角,而在DirectX中,原點位于左上角。Unity中使用的紋理空間是符合OpenGL的傳統的,位于紋理左下角。
一、單張紋理
通常使用一張紋理來代替物體的漫反射顏色。
紋理導入面板
- Filter Mode ,代表紋理拉伸時的濾波模式,支持3種模式: Point、Bilinear、Trilinear;效果依次增加。
- 紋理縮小時,多個像素將會對應一個目標像素。我們往往需要處理抗鋸齒問題。一個最常用的方法是使用多級漸遠紋理(mipmapping)技術。即提前用了濾波處理得到了更多更小的圖像,儲存起來。運行時,可以直接使用。通常需要多占用33%的空間。
- Point:使用最近鄰濾波,在放大或縮小時,采樣像素數目通常只有一個,一次圖像看起來有種像素風格。
- Bilinear:使用線性濾波,對于每個目標像素,它會找到4個近鄰像素,然后對它們進行線性插值混合后得到的最終像素,因此圖像看起來被模糊了。
- Trilinear:除了Bilinear所做的工作之外,還會在多級漸遠紋理之間進行混合。
- 紋理的最大尺寸:unity允許不同平臺發布游戲時,選擇不同的分辨率。如果導入的紋理大小超過了Max Texture Size中的設置值,那么unity將會把該紋理縮放為這個最大分辨率。理想情況下,導入的紋理可以是非正方形的,但長寬的大小應該是2的冪。這樣unity內部才能進行壓縮,而且GPU讀取該紋理的速度更快。
二、凹凸映射
兩種凹凸映射做法
高度映射:使用一張高度紋理來模擬表面位移,然后得到一個修改后的法線值。優點是直觀,缺點是消耗運行時性能。高度紋理更多用來存儲地形信息。高度圖中存儲的是強度值,表示模型表面局部的海拔高度。
法線映射:直接存儲表面法線信息,由于法線方向的分量范圍在[-1, 1],而像素的分量范圍是[0,1],因此我們需要做一個映射,通常使用的映射就是。所以我們從法線紋理進行采樣后,需要進行一次反映。
pixel=normal+12pixel = \frac{normal + 1}{2} pixel=2normal+1?
模型空間法線紋理 VS 切線空間法線紋理:
Unity中的法線紋理類型
Unity可以把法線紋理標識成Normal map類型,此時可以使用shader中內置的UnpackNormal函數,來得到正確的法線方向。
當我們把紋理類型設置為Normal map,可以讓Unity根據不同平臺對紋理進行壓縮(DXT5nm)。原理就是發現紋理只有兩個通道是真正具有信息的,第三個通道的值可以用另外兩個推導出來(法線是單位向量,切線空間下的法線方向的Z分量為正)。
三、 漸變紋理
使用漸變紋理來控制漫反射光照的結果。
- 書本這里使用半蘭伯特模型,計算UV坐標。書里沒有明說這么做的理由是什么,這里部分是我自己思考的。我們的目的是得到顏色分層的結果。觀察漸變紋理,我們發現色帶前面的對應陰影部分,后面對應光照強烈的部分。所以每個片元收到的光照越強,就應該對應色帶值大的分。正好半蘭伯特模型也是這樣,受到的光照越強,得到的值越大。就這樣應用過來了。
- 注意:漸變紋理的Weap Mode需要設置為Clamp模型,防止紋理采樣時由于浮點數精度造成問題。
四、遮罩紋理
遮罩紋理,字面翻譯就是通過遮罩保護某些區域,使它免于某些修改。比如書中例子的高光遮罩紋理,在紋理RGBA的R分量里儲存了mask值。在shader中通過下面的語句使用。采樣了遮罩紋理,然后將值乘在原高光分量上。用來控制高光的強度。
// Get the mask value fixed specularMask = tex2D(_SpecularMask, i.uv).r * _SpecularScale; // Compute specular term with the specular mask fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(tangentNormal, halfDir)), _Gloss) * specularMask;- 其實看到這里我們已經發現了,我們想逐像素的控制表面屬性。就把對應像素的參數都填充在一個紋理里,在shader中參與計算就行了。通常,我們可以充分利用一張紋理的RGBA四個通道,用于儲存不同的表面屬性參數。
引用
-
如何創建法線貼圖
-
Unity Shader入門精要 閱讀筆記十
總結
以上是生活随笔為你收集整理的Unity 基础纹理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity基础组件及介绍
- 下一篇: Unity基础UI框架