一.Mipmap的生成
虚幻引擎在导入贴图的时候,如果贴图的尺寸是为2的N次方,那么引擎会预生成一组等比压缩的纹理,这一组纹理叫Mipmap.
如下图所示,当导入一张10241024的原始纹理,会生成11张Mipmap
从原始纹理2的10次方,10241024分辨率,一直到2的0次方,11分辨率,共计11张纹理.
如果是20482048分辨率,则会生成12张,以此类推,目前UE5最高可以导入16384分辨率的16K纹理,则可以生成15张Mipmap。
最大可导入16K纹理素材
需要注意的一点是,如果纹理要生成mipmap,纹理的长宽都必须是2的N次方,也就是纹理的长宽像素,必须是1、2、4、6、16、32、64、128、512、1024、2048、4096、8192、16384.
如果不是的话,则不会生成,如下图这张40004000的纹理。
分辨率40004000无法生产Mipmap
非正方形纹理,只要长宽像素在2的N次方范围内,也能生成Mipmap。生成的数量,以最长的边为主。
假设一张纹理为1024256,则以最长边1024分辨率为最终生成数量,11张mipmap。这样也会产生一个BUG,某些小纹理长宽比会出错。下图,当一张1024256的图导入引擎,LOD为9\10层级时,长宽比已经不是最初的4:1了
所以,非必要情况,纹理资产进引擎,最好是正方形且尺寸为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://www.cs.columbia.edu/cg/normalmap/normalmap.pdf
到后面将粗糙度写入法线纹理中,以纠正小Mipmap的法线贴图导致法线丢失但是相对的增加粗糙度来修正这个问题。
可以参考https://media.steampowered.com/apps/valve/2015/Alex_Vlachos_Advanced_VR_Rendering_GDC2015.pdf
如下图
UE里面也有相关的问题,简单通过材质修正了一下,通过mipmap提高了远处的粗糙度
修正前
修正后,根据距离提高了远处的粗糙度
四、UE贴图Mipmap相关参数
相关参数只有这些,官方文档有详细解释
官方文档:
https://docs.unrealengine.com/4.27/zh-CN/RenderingAndGraphics/Textures/Properties/docs.unrealengine.com/4.27/zh-CN/RenderingAndGraphics/Textures/Properties/
有一点需要注意的是,不同的纹理组的设置,在Texture Streaming的加载是有优先级的
角色相关的贴图和部分植被相关的贴图,Mipmap的加载优先级要高于其他的。
角色相关的贴图更优先加载
文章转载自:https://zhuanlan.zhihu.com/p/425649398 侵删!