Unity3D引擎之渲染技术(六):纹理坐标
本篇文章主要是给大家介绍关于纹理坐标,模型上面的贴图是通过纹理映射技术将其附加在模型上面,美术人员利用Max工具建模时,会在建模软件中利用纹理展开技术把纹理映射坐标存储在每个顶点上,纹理映射坐标定义了该顶点在纹理中对应的2D坐标。这些坐标使用一个二维变量(u,v)来表示,纹理映射坐标也称为UV坐标。
纹理的大小可以是多种多样的,可以是256X256或者1028X1028,但顶点的UV坐标的范围通常都被归一化到[0,1]范围内,需要注意的是,纹理采样时使用的纹理坐标不一定是在[0,1]范围内。实际上,这种不在[0,1]范围内的纹理坐标有时会非常有用。我们会在后面的博客中相加阐述。
在前面的文章中给大家介绍过,在OpenGL里,纹理空间的原点位于左下角,在DirectX中,原点位于左上角。而在Unity中避免了这种差异问题,Unity是跨平台的引擎,只有一种坐标系,它使用的是OpenGL也就是说,原点位于纹理左下角。效果如下所示:
接下来介绍Unity引擎的图片设置如下图所示:
这里面有一个重要的属性,就是Warp Mode,它决定了当纹理坐标超过[0,1]范围后将会如何被平铺,Wrap Mode有两种模式:一种是Repeat,在这种模式下,如果纹理坐标超过了1,它的整数部分将会被舍弃,而直接使用小数部分进行采样,这样的结果是纹理将会不断重复;另一种是Clamp,在这种模式下,如果纹理坐标大于1,将会截取到1,如果小于0,那么将会截取到0。下面是两种模式下的效果图:
在Repeat模式下的图是重复出现:
而在Clamp模式下的效果图如下所示:
多余的部分就被截取掉了,正常的效果如下所示:
另外还有一个Filter Mode,在内部实现上,Point模式使用了最邻近滤波,在放大或者缩小时,它的采样像素数目通常只有一个,因此图像,而Biinear滤波则使用了线性滤波,对于每个目标像素,它会找到4个邻近像素,然后对它们进行线性插值混合后得到最终像素,因此图像看起来像被模糊了。而Trilinear滤波几乎是和Bilinear一样的,只是Trilinear还会在多级渐远纹理之间进行混合。具体效果,读者可以自行设置查看,这里就不一一列举了。
下面再介绍一下纹理尺寸,当我们在为不同平台发布游戏时,需要考虑目标平台的纹理尺寸和质量问题,Unity允许我们为不同目标平台选择不同的分辨率。如果导入的为难大小超过了Max Texture Size中的设置值,Unity将会把该纹理缩放为这个最大分辨率。理想情况下,导入的纹理可以是非正方形的,但长宽大小应该是2的幂,如果使用了非2的幂大小纹理,那么这些纹理会占用更多的内存空间,而且GPU读取该纹理的速度也会有所下降。出于性能和空间的考虑,尽量使用2的幂大小纹理。
使用纹理精度越高的(Truecolor),占用的内存空间越大,但得到的效果也越好,当使用了大量的Truecolor类型的纹理时,内存可能会迅速增加,因此对于不需要高精度的可以尽量使用压缩格式。