(四)Unity性能优化-纹理基础

发布时间 2023-09-22 09:39:38作者: ZERO_BEYOND

纹理类型

**Default:**默认的纹理类型格式
**Normal map:**法线贴图,可将颜色通道转换为适合实时法线贴图格式
**Editor GUI and Legacy GUI:**在编辑器GUI控件上使用纹理请选择此类型
**Sprite(2D and UI):**在2D游戏中使用的精灵(Sprite)或UGUI使用的纹理请选择此类型
**Cursor:**鼠标光标自定义纹理类型
**Cookie:**用于光照Cookie剪影类型的纹理
**Lightmap:**光照贴图类型的纹理,编码格式取决于不同的平台
**Single Channel:**如果原始图片文件只有一个通道,请选择此类型

纹理大小

选择合适纹理大小应尽量遵循以下经验:

不同平台、不同硬件配置选择不同的纹理大小,Unity下可以采用bundle变体设置多套资源、通过Mipmap限制不同平台加载不同level层级的贴图。
根据纹理用途的不同选择不同的纹理加载方式,如流式纹理加载Texture Streaming、稀疏纹理Sparse Texture、虚拟纹理VirtualTexture等方式。
不能让美术人员通过增加纹理大小的方式增加细节,可以选择细节贴图DetailMap或增加高反差保留的方式。
在不降低视觉效果的情况下尽量减小贴图大小,最好的方式是纹理映射的每一个纹素的大小正好符合屏幕上显示像素的大小,如果纹理小了会造成欠采样,纹理显示模糊,如果纹理大了会造成过采样,纹理显示噪点。这一点做到完美平衡很难保障,可以充分利用Unity编辑器下SceneView->DrawMode->Mipmap来查看在游戏摄像机视角下哪些纹理过采样,哪些纹理欠采样,进而来调整纹理大小。

纹理颜色空间

​ 默认大多数图像处理工具都会使用sRGB颜色空间处理和导出纹理。但如果你的纹理不是用作颜色信息的话,那就不要使用sRGB空间,如金属度贴图、粗糙度贴图、高度图或者法线贴图等。一旦这些纹理使用sRGB空间会造成视觉表现错误。

纹理压缩
​ 纹理压缩是指图像压缩算法,保持贴图视觉质量的同时,尽量减小纹理数据的大小。默认情况下我们的纹理原始格式采用PNG或TGA这类通用文件格式,但与专用图像格式相比他们访问和采样速度都比较慢,无法通用GPU硬件加速,同时纹理数据量大,占用内存较高。所以在渲染中我们会采用一些硬件支持的纹理压缩格式,如ASTC 、ETC、ETC2、DXT等。

​ 如下图为未压缩、ETC2、ASTC6x6三种格式文件大小对比,我们可以看到在质量相差不大的情况下ASTC6x6压缩下大小可以减少到接近未压缩的十分之一。

纹理图集

纹理图集是一系列小纹理图像的集合,

  • 优点:

​ 一是采用共同纹理图集的多个静态网格资源可以进行静态合批处理,减少DrawCall调用次数。

​ 二是纹理图集可以减少碎纹理过多,因为他们打包在一个图集里,通过压缩可以更有效的利用压缩,降低纹理的内存成本和冗余数据。

  • 缺点

​ 美术需要合理规划模型,并且要求模型有相同的材质着色器,或需要制作通道图去区分不同材质。制作和修改成本较高。

纹理过滤

**Nearest Point Filtering:**临近点采样过滤最简单、计算量最小的纹理过滤形式,但在近距离观察时,纹理会呈现块状。
**Bilinear Filtering:**双线性采样过滤会对临近纹素采样并插值化处理,对纹理像素进行着色。双线性过滤会让像素看上去平滑渐变,但近距离观察时,纹理会变得模糊。
**Trilinear Filtering:**三线性过滤除与双线性过滤相同部分外,还增加了Mipmap等级之间的采样差值混合,用来平滑过度消除Mipmap之间的明显变化。
**Anisotropic Filtering:**各向异性过滤可以改善纹理在倾斜角度下的视觉效果,跟适合用于地表纹理。

纹理Mipmap

Mipmap纹理
​ 逐级减低分辨率来保存纹理副本。相当于生成了纹理LOD,渲染纹理时,将根据像素在屏幕中占据的纹理空间大小选择合适的Mipmap级别进行采样。

优点:
​ GPU不需要在远距离上对对象进行全分辨率纹理采样,因此可以提高纹理采样性能。

​ 同时也解决了远距离下的过采样导致的噪点问题,提高的纹理渲染质量。

缺点:
​ 由于Mipmap纹理要生成低分辨率副本,会造成额外的内存开销。