一.Mipmap的生成
虛幻引擎在匯入貼圖的時候,如果貼圖的尺寸是為2的N次方,那麼引擎會預生成一組等比壓縮的紋理,這一組紋理叫Mipmap。
如下圖所示,當匯入一張1024*1024的原始紋理,會生成11張Mipmap
從原始紋理2的10次方,1024*1024解析度,一直到2的0次方,1*1解析度,共計11張紋理。
如果是2048*2048解析度,則會生成12張,以此類推,目前UE5最高可以匯入16384解析度的16K紋理,則可以生成15張Mipmap。
最大可匯入16K紋理素材
需要注意的一點是,如果紋理要生成mipmap,紋理的長寬都
必須是2的N次方
,也就是紋理的長寬畫素,必須是
1、2、4、6、16、32、64、128、512、1024、2048、4096、8192、16384.
如果不是的話,則不會生成,如下圖這張4000*4000的紋理。
解析度4000*4000無法生產Mipmap
非正方形紋理,只要長寬畫素在2的N次方範圍內,也能生成Mipmap。
生成的數量,以最長的邊為主。
假設一張紋理為1024*256,則以最長邊1024解析度為最終生成數量,11張mipmap。這樣也會產生一個BUG,某些小紋理長寬比會出錯。下圖,當一張1024*256的圖匯入引擎,LOD為9\10層級時,長寬比已經不是最初的4:1了
當LOD為9\10時,長寬比例出錯
所以,非必要情況,紋理資產進引擎,最好是
正方形
且
尺寸為2的N次方。
二、Mipmap的優點
Mipmap紋理的優點分為兩個方面,
效果最佳化
和
效能最佳化
1.效果最佳化
Mipmap的本質是為了處理場景中遠處物體
低頻取樣
導致的
畫面失真
比如出現
閃爍
或者
摩爾紋
這只是針對具有
高頻
變換(有色彩變化)的紋理,如果紋理是一個
純色
,則有沒有Mipmap並沒有任何影響。
當然,處理畫面失真也只能夠處理
靜態
(頻域)情況下的畫面失真,如果是
動態
(時域)情況下(時域)的畫面失真,Mipmap是無效的,比如高速位移的紋理。
2.效能最佳化
Mipmap是以
空間換時間形式
的效能最佳化。能夠有效降低視訊記憶體頻寬的佔用,以更快的時間渲染,因為根據相機距離,載入了小解析度的貼圖。
但是記憶體的佔用提高了三分之一。
同一張紋理,生成Mipmap和不生成Mipmap,記憶體的佔用相差了三分之一。
三、缺點
缺點主要是因為遠處的物體載入了低解析度的貼圖,導致效果上產生了差異。
1.Mask紋理透明
對於具有精細Mask紋理的材質,相機距離過遠,Mask切換成了精度較低的紋理,會導致材質出現錯誤。比如植被的樹葉消失。
解決方法:將Opacity Mask Clip Value改成0。01
2.法線失真
相機拉遠的同時,材質的法線紋理切換為小解析度的貼圖,會導致模型表面變得光滑,材質效果失真。
早在很久很久以前,人們就發現了這個問題,針對這個問題的解決方案也很多。
從最早04年Michael Toksvig的Mipmapping Normal Maps這篇文章採用正態分佈的方法進行處理法線貼圖
https://developer。download。nvidia。com/whitepapers/2006/Mipmapping_Normal_Maps。pdf
以及
https://www。
cs。columbia。edu/cg/norm
almap/normalmap。pdf
到後面將粗糙度寫入法線紋理中,以糾正小Mipmap的法線貼圖導致
法線丟失
但是相對的
增加粗糙度
來修正這個問題。
可以參考
https://
media。steampowered。com/
apps/valve/2015/Alex_Vlachos_Advanced_VR_Rendering_GDC2015。pdf
如下圖
UE裡面也有相關的問題,簡單透過材質修正了一下,透過mipmap提高了遠處的粗糙度
修正前
修正後,根據距離提高了遠處的粗糙度
四、UE貼圖Mipmap相關引數
相關引數只有這些,官方文件有詳細解釋
有一點需要注意的是,不同的紋理組的設定,在Texture Streaming的載入是有優先順序的
角色相關的貼圖
和部分植被相關的貼圖,Mipmap的載入優先順序要高於其他的。
角色相關的貼圖更優先載入