Unity Shader入门精要笔记(十二):纹理属性

来源:互联网 发布:stddev sqlserver 编辑:程序博客网 时间:2024/06/05 10:48

本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。

http://blog.csdn.net/lzhq1982/article/details/75045358


纹理从广义上讲不是一个普通的图片,我们今后会遇到各种功能性纹理,比如法线纹理,立方体纹理等,我们在Unity中选中一个纹理,属性面板会看到很多属性,比如上一篇的普通纹理


下面我们对这些属性做个大致的介绍。

1)Texture Type

纹理类型,点开后会看到一串选择,Default就是默认的纹理类型,也就是普通的图片,还有后面篇章我们要讲的法线纹理类型Normal map,还有2D中用到的Sprite等,我们要选择合适的类型,Unity才会知道该纹理的功能,也会有适应的优化。

2)Texture Shape

默认2D,还有Cube,也就是立方体纹理,后面篇章再介绍。

3)sRGB(Color Texture)

也就是标准颜色的纹理,如果不需要标准RGB颜色的纹理,可以不勾选。

4)Alpha Source

Alpha通道的来源,如果选择none表示没有该通道,默认Input Texture Alpha,表示来自于该纹理。From Gray Scale,透明通道的值会由每个像素的灰度值生成。

5)Alpha Is Transparency

当alpha用于透明处理时,我们要勾上该选项,可以防止不透明边缘锯齿现象,如果Alpha有他用,可以不勾选。

6)Wrap Mode

它决定了当纹理坐标超过[0, 1]范围后将如何平铺。有两项,repeat和clamp,repeat顾名思义,表示重复,当纹理坐标超过1时,整数部分被舍弃,直接使用小数部分进行采样,纹理会不断重复;clamp,纹理坐标大于1时会截取到1,小于0时会截取到0。如下图:



两幅图都是平铺属性为(3,3)的效果,上图repeat就不断重复,下图clamp则截取到边界。

注意,如果要这样的效果,不要忘了Shader中使用纹理的属性(例如上一篇的_MainText_ST)对纹理坐标进行变换,也就是需要类似下面的代码:

o.uv = TRANSFORM_TEX(v.uv, _MainTex);

否则面板没有这个重复模式的选项。

还可以调整纹理坐标的偏移量,使纹理不以(0,0)为原点。下图展示了偏移属性为(0.2, 0.6)时分别使用两种Wrap Mode的结果。



7)Filter Mode

它决定了当纹理由于变换产生拉伸时会采用哪种滤波模式。有3种模式:Point,Bilinear,Trilinear。

a、Point模式:最近点采样,当纹理坐标没有刚好对应Texture上的一个采样点时,它会选择最近的一个采样点作为该坐标的采样值,当纹理没有拉伸变形时,这样还不错,因为速度是最快的,但如果拉伸变形了,会出现马赛克现象。

b、Bilinear模式:双线性过滤,以像素对应的纹理坐标为中心,采样它周围4个texel(纹素)的像素,取平均值作为该坐标采样值。这是Unity默认的模式,过渡效果相对平滑,当然速度会比最近点采样有一定下降。

c、Trilinear模式:三线性过滤,会对像素大小和纹素大小最接近的两层Mipmap level分别进行双线性过滤,再对结果进行线性插值。由于使用了两次双线性过滤,也就是计算2x4=8个像素的值,速度会更加下降,当然滤波效果更好。下图是一张64x64的纹理贴在512x512的平面时用三种过滤的效果图:


8)Generate Mip Maps

当纹理缩小时,纹理中多个像素将会对应一个目标像素。这样就会出现锯齿现象。一个最常用的方法就是多级渐远纹理(mipmapping)技术。该技术将原纹理提前用滤波处理来得到很多更小的图像,形成一个图像金字塔,每一层都是对上一层图像降采样的结果。在实时运行时,比如物体远离摄像机时,可以直接用较小的纹理采样。如下图:


比如一张128*128的图,会生成64*64,32*32,16*16,8*8,4*4,2*2,1*1的图片,当然,因为要多存储这些图片,通常会多占用33%的空间。这是典型的空间换取时间的方法。所以使用时如果因为摄像机远近会放大缩小的图,比如场景资源,我们尽量用mipmap,否则取消mipmap,比如ui元素。

9)Max Size

纹理最大尺寸,在纹理属性里我们看最后的部分,因为没选所以是灰色的,它会根据不同平台进行设置,如果我们导入的纹理大小超过了Max Size,那么Unity会把该纹理缩放成这个最大分辨率。导入的纹理可以是非正方形的,但长宽该是2的幂。如果使用了非2的幂大小(Non Power of Two, NPOT)的纹理,这些纹理往往会占用更多的内存空间,GPU读取速度也会下降。所以Unity在内部会把它缩放成最近的2的幂。出于性能和空间考虑,我们应尽量使用2的幂的纹理。

10)Format

Unity内部使用哪种格式存储该纹理。打开其下拉条,我们看到一捆格式,纹理的精度越高,占用的内存越大,得到的效果也越好,最好的是RGBA 32 bit,如果没有alpha通道,RGB 24 bit也是效果最好的,但带宽太大不是好事,对于不需要使用高精度的纹理,我们要适当的用压缩格式,这对手机平台尤其重要。

好了,纹理属性就介绍到这,如果需要进一步了解,就去苹果官方吧,下一篇我们讲一个纹理类型,凹凸纹理。

原创粉丝点击