2.3 Texture导入设置及优化
2.3.1 纹理类型
- Default
- Normal Map
- Editor GUI and Legacy GUI:在编辑器GUI上使用纹理的类型
- Sprite:常用于2D游戏和UGUI
- Cursor:鼠标光标自定义纹理类型
- Cookie:用于光照Cookie
- Lightmap:光照贴图类型的纹理
- Single Channel:如果原始图片文件只有一个通道,建议使用此类型
2.3.2 纹理大小
一般建议为2的幂次
建议遵循以下经验:
- 不同平台不同硬件配置选择不同的纹理大小;
- unity下可以采用bundle变体设置多套资源;
- 或者通过Mipmap限制不同平台加载不同Level层级的贴图;
- 根据纹理用途不同,选择不同的纹理加载方式;
- 流式纹理加载:Texture Streaming
- 稀疏纹理:Sparse Texture
- 虚拟纹理:VirtualTexture
- 不能让美术人员通过增加纹理大小的方式增加细节;
- 可以选择细节贴图DetailMap;
- 在美术原图上增加高反差保留;
- 在不降低视觉效果的前提下,尽量减小贴图大小;
- 理想情况下:纹理映射的每一个纹素的大小正好符合屏幕上显示像素的大小;
- 建议辅助利用SceneView->DrawMode->Mipmap选项来查看场景中的过采样和欠采样部分;
2.3.3 纹理颜色空间
一般情况下,作为颜色信息的纹理一般都会使用sRGB颜色空间处理和导出纹理;
但是对于提供非颜色信息,比如:金属度贴图、粗糙度贴图或者法线贴图等,就不需要勾选sRGB,否则会造成视觉效果错误。
2.3.4 纹理压缩
在保持纹理视觉质量的同时,尽量减小纹理数据的大小;
ASTC、ETC、ETC2等格式都是常见的纹理压缩格式;
2.3.5 纹理图集
纹理图集是一系列小纹理图像的集合;
- 优点:
- 采用共同纹理图集的多个静态网格资源可以进行静态合批处理,减少DrawCall调用;
- 纹理图集可以解决碎片纹理过多的问题,将他们打包后在进行压缩可以有效利用空间,降低纹理的内存成本和冗余数量;
- 缺点:
- 美术需要合理规划模型,并且要求模型有相同的材质着色器;
- 或者需要制作通道图去区分不同材质,制作和修改成本较高;
2.3.6 纹理过滤
- Nearest Point Filtering
- Bilinear Filtering:平衡性能和视觉质量;
- Trilinear Filtering:有选择的使用;
- Anisotropic Filtering:各向异性过滤适用于地表的纹理贴图
- 对于混合使用,建议使用:双线性和2x各向异性过滤,而不是三线性和1x各向异性过滤,因为前一种做法不仅视觉效果更好,而且性能更高;
- 另外,尽量选用较低的各向异性级别,仅对关键游戏资源使用高于2的级别;
aniso level:各向异性过滤等级
2.3.7 纹理Mipmap
逐级减低分辨率来保存纹理副本;相当于生成了纹理LOD。
- 优点:
- GPU在远距离上不需要记性全像素的纹理采样,提高了纹理采样的性能;
- 同时解决了远距离下过采样导致的噪点和失真问题;
- 缺点:
- 额外的内存开销;(但是可以通过unity中的Mipmap streaming功能,在渲染时仅对某个层级以下的贴图进行采样,从而尽可能的降低内存开销)
- 同时也是 hierarchy z cull (层级剔除)的前提条件;
2.3.8 导入设置
Texture Shape
- 2D
- Cube 一般用于天空和反射探针,可以手动生成也可以通过脚本RenderToCubeMap自动生成;
- 2D Array 2D纹理数组,可以极大提升大量相同大小和格式的纹理的访问效率,但需要特定平台支持,可以通过引擎SystemInfo.supports2DArrayTextures接口运行时查看是否支持;
- 3D 通过纹理位图方式存储或传递一些3D结构化数据,一般用于体积仿真,如雾效、噪声、体积数据、距离场、东华数据等信息,可以外部导入,也可以运行时程序化创建;
Alpha Source
一般默认选择Input Texture Alpha就好,如果确定不使用原图中的alpha通道则可以选择None。
Alpha Is Transparency
如果位图像素不关系是否要半透明可以不开启此选项。这样Alpha信息只需要占1bit。节省内存
Ignore Png file gamma
一般上制作流程中没有其他特殊设置,该项默认选择就好;
Read/Write
开启后内存占用将提高一倍,一般不开启,除非有动态读取纹理的需求;
Streaming Mipmaps 和 Virtual Texture Only
保持默认即可;
Generate Mip Maps
什么时候不需要Mipmaps:
- 2D场景
- 固定视角,摄像机无法缩放远近
Border Mip Maps
默认情况下不开启,只有当纹理类型为Light Cookies时才开启,避免color bleeding现象,颜色渗透到较低级别的MipLevel纹理边缘上;
Mip Maps Filtering
- Box最简单,随尺寸减小,Mipmap纹理变得平滑模糊;
- Kaiser,避免平滑模糊的锐化过滤算法;
Mip Maps Preserve Coverage
只有需要纹理在开启Mipmap的同时还需要做Alpha Coverage时开启,默认不开启;
Fadeout Mip Maps
纹理Mipmap随层级淡化为灰色,一般不开启,只有在雾效较大时开启,以防影响视觉效果;
2.3.9 实际纹理问题
- 纹理图集大小设定不合理,造成纹理资源的浪费
- 纹理图集中的内容声明周期不同,导致纹理图集长时间占用内存难以释放;
- 半透明纹理经常占用大量的纹理空间,这一点一般要从UI设计上避免;
- 过多的2D序列帧动画,应当组合成纹理图集;
- 大量重复纹理和不合理的通道图利用;
- 只有颜色差异的内容相似的UI贴图,可以采用分离变化区域贴图,同时采用UI的九宫格缩放;
- 颜色渐变贴图建议使用单通道压缩和单像素宽度;
2.3.10 优化结果
优化方向:
- 对于Metallic贴图,RGB通道没有内容的贴图可以直接调整为单通道贴图,但是其中一部分贴图需要通过金属度计算光滑度,所以没办法转换为单通道。因此在美术资源设计阶段应当做好规范。
- 调整了各向异性的等级为2;
前:
后:
虽然整体看起来没有改变,但是相比视频中的原体积还是缩小了很多,推测可能是该项目在这个过程中优化过,所以占用减少了。
并且对纹理都提升了各向异性等级,与未提升前相比也没有明显的内存开销增加;
课程链接