目录
[TOC]
写在前面
本文将讲述如何在Unity中纹理的相关设置,主要是WarpMode、MipMaps、FilterMode和AnisoLevel。
在PC前的各位读者,建议下载MD文件阅读,观感更好。若有图片无法显示,请开启网络。欢迎转载,只需注明转载来源地址即可。MD文件及工程Package下载地址(提取码:bypu)
进阶设置
准备工作
使用HTUtility工具(Shift+Alt+G)创建合适的文件夹结构,重命名Root文件夹为”Textures”。
将纹理贴图导入Unity。
在场景中创建3D物体”Plane”,改名为”TexturesSettingTestGO”。新建一个Material,取名为”TexturesSettingTestMat”;新建一个Unlit Shader,取名为”TexturesSettingTest”。将Shader赋给Material,将Material赋给场景中新建的物体。移动摄像机到适合观察的位置。
点击场景中的”TexturesSettingTestGO”,在检视面板中查看:
其中Tiling(平铺显示)可以缩放纹理坐标。
打开纹理的Inspector面板,点开Advanced(进阶)菜单。
1.WrapMode(包裹模式)
WrapMode会直接影响到Tiling(平铺显示)的显示结果。
Tiling为(x,y)=(1,1)时(默认情况):
WrapMode共有5个可选项:
Repeat(重复)和Clamp(夹紧)
将Tiling设为(x,y)=(2,2)时,Repeat和Clamp依次为:
- Repeat(重复):
说明:当纹理坐标超过1,整数部分直接被舍弃,继续使用小数部分采样。导致纹理会不断重复。
边缘像素:边缘像素与纹理另一侧混合,如果纹理另一侧像素颜色和当前边缘不一致的话,会产生混合区域的颜色像素。
“00”位置的另一侧纹理一个是黄色,一个是蓝色,所以产生了如下的边缘混合颜色。
- Clamp(夹紧):
说明:纹理坐标会截取到[0,1]之间。防止纹理重复;纹理边界被复制,导致纹理边界看起来像被拉伸了。
边缘像素:边缘像素与自身混合。会产生一个像素不混合的微小区域,但是非常不明显。边缘不再有Repeat的问题。
Mirror、MirrorOnce、Per-axis
说明:节省篇幅,我们就不单独看Mirror(镜像)了。直接看Per-axis,它可以分别设置两个轴上的WarpMode,比如可以U轴上设置为Mirror,V轴上设置为Repeat。
此时Repeat模式下边缘颜色混合的问题依旧存在。
2.MipMaps(多级渐远纹理)和FilterMode(滤波模式)
将WrapMode重新设置回Repeat模式,设置Tiling为(x,y)=(5,5)。
当纹理由于变换产生拉伸时将采用哪种滤波模式,滤波模式共有3个可选项:(性能消耗递增)
Point(no filter)
无滤波模式,当在某些UV坐标下采样纹理时,使用最近的纹理,会使得纹理产生”块状”外观,锯齿明显。常用于像素风格。
由图可见,远处很明显的锯齿感。
我们放大10倍,设置Tiling为(x,y)=(0.1,0.1):
具有很强的像素风格。
Bilinear
双线性滤波模式(默认采用此模式),纹理采样会进行内插。当纹理密度小于显示像素密度时,(比如放大纹理,同上放大10倍,设置Tiling为(x,y)=(0.1,0.1))显示的像素颜色是纹理之间进行内插得到的。所以出来的效果会有渐变模糊的效果,柔和了原本明显的锯齿感。
当纹理密度大于显示像素密度时,一个显示像素上可能有多个纹理像素,在内插时可能会跳过部分纹理像素,此时此法失去原有的效果和不使用滤波效果几乎一样。
设置Tiling为(x,y)=(8,8),此时纹理密度远大于显示像素密度,Point(no filter)和Bilinear依次为:
区别微乎其微。
对于远处的锯齿感如何消除呢?常用的方法就是使用MipMaps(多级渐远纹理)。
MipMaps(多级渐远纹理)
MipMaps是如何运作的呢?由于纹理密度过大时会产生严重的锐化感,所以在纹理密度过大时使用小版本的纹理。
这小版本的纹理就被称为MipMap,自动生成,会生成多级纹理,每一级都是前一级的一半宽高。比如原始256x256,则MIP映射为:128x128、64x64、32x32、16x16、8x8、4x4、2x2。
由于是自动生成,所以为了保存此纹理,会消耗额外的33%内存空间,以空间换时间。
开启方式:
开启MipMaps后的各个滤波模式对比:
为了便于观察请将AnisoLevel(各向异性等级)调为0。
未开启MipMaps
远处极强的锐化感。
Point(no filter)
每间隔一段距离,纹理突然模糊化一点,这是应用了宽高仅为上一级一半大小的MipMap的缘故。整体依旧锯齿严重,这是由于没有开启滤波,像素颜色没有进行内插。
Bilinear
同上一样,每间隔一段距离,纹理突然模糊化一点,这是应用了宽高仅为上一级一半大小的MipMap的缘故。
如果知道不同级别的MipMap在哪里,你就可以清楚的看到纹理质量的突变。当纹理投影变小时,纹理密度增加,使得纹理看起来更加清晰,直到开始使用下一等级的MipMap,它又突变模糊,然后依次循环。
但不同的是,Bilinear使用了双线性滤波。每个目标像素都会寻找周围4个邻近像素进行线性插值混合颜色。所以图像相对Point(no filter)显得模糊化,锯齿感降低。
Trilinear
三线性滤波,只有在开启MipMaps才会产生不同于双线性滤波的作用。它的作用在于在多级渐远纹理之间进行了内插混合。减少了因为MipMap改变时产生的突变的模糊感。
将图像放大后看更加明显,依次为双线性滤波和三线性滤波:
3.AnisoLevel(各向异性等级)
当事物在不同方向出现相似时,即为各向同性,如一个Cube。如果不是,则为各向异性。
当纹理以某一角度投影时,由于透视,某一维度会比另一维度扭曲更多。如下图:
前后和左右差异很大,得到的结果非常模糊,模糊的程度会随着这种差异的增加而增加。
此时使用各向异性滤波可以明显改善这一问题。它将会提供更多的不同尺寸的MipMap。但是不再是预先生成了,所以各向异性滤波不消耗过多的内存,但会消耗较多性能。
调整各向异性等级为16后的效果:
各向异性等级的设置
在“Edit–Project Settings–Quality”中:
Disabled:完全关闭各向异性滤波,无论纹理中如何设置。
Per Texture:由各个纹理自行设置。
Forced On:强制为所有纹理设置各向异性等级为9。
写在最后
本篇粗略讲解了纹理设置中比较重要的部分,关于纹理大小、压缩方式等暂时省略了。以后有空再补全。
Reference
Rendering 2 Shader Fundamentals
UnityShader入门精要