浅谈Unity中的Mipmap与Texture Streaming技术Mipmap技术Unity中的Mipmap技术相当于Texture的Lod(Level of Detail)技术,主要用于解决物体离相机较远时因贴图采样率不足导致的条纹现象。Mipmap通过生成一系列不同分辨率的纹理层级,使得在渲染时可以根据物体与相机的距离选择合适的纹理层级,从而提高渲染效率和质量。Mipmap的生成:在Unity中,生成Mipmap非常简单。只需在Texture的面板中勾选“Generate Mip Maps”,然后点击“Apply”即可。生成完毕后,可以在下方查看每一级level所对应的图片。这些图片是通过均值采样法生成的,形成一个金字塔形的纹理层级结构。内存占用:虽然Mipmap能够提升渲染质量,但它也会增加内存占用。这是因为除了原始的纹理外,还需要存储多个不同分辨率的纹理层级。例如,一个1M的图片在生成Mipmap后可能会变成1.3M,这主要是因为Mipmap金字塔排布导致的额外空间占用。Mipmap Level的选择:Unity中的Mipmap是自动生成的,但无法手动设置生成多少level的图片,也无法在Editor里设置相机距离texture多少时使用哪个level的图片。不过,在Shader中可以设置Mipmap Level。Unity的Mipmap Level算法会根据物体与相机的距离自动选择合适的纹理层级,这个选择过程在片元着色器之前完成,且level的切换自带渐变效果,是通过插值实现的。手动计算Mipmap Level:虽然Unity会自动选择Mipmap Level,但也可以手动计算并设置。原理是计算相邻片元对应的uv纹素坐标的差值,代表模型在相机下占据大小的相对值。具体计算方法是取纹素差值在x方向或y方向上的最大值,然后进行log2操作。这种方法可以得到更精细的Mipmap Level控制,但实现起来相对复杂,且性能消耗较大。Texture Streaming技术Texture Streaming技术是解决Shader渲染时整个Texture Mipmap金字塔全部加载的问题,特别是在模型离相机较远时,可以显著优化内存占用和渲染性能。开启Texture Streaming:要在Unity中开启Texture Streaming,需要在Texture和Project Setting中分别进行设置。设置完成后,Unity会在相机未看到Mesh时加载最小的Mipmap,当相机看到后会计算得到一个合理的Mipmap Level,并将其他level的Mipmap裁剪掉,不进行加载。这样可以显著减少内存占用,提高渲染性能。优化效果:开启Texture Streaming后,可以获得显著的优化效果。例如,一个1.3M的纹理在相机距离较远时,可以优化到只有85K,这取决于MaxLevelReduction的设置。MaxLevelReduction是一个重要的参数,它决定了在相机看到Mesh时加载的最高Mipmap Level。改进思路:虽然Texture Streaming已经提供了很好的优化效果,但仍有改进空间。一种思路是在CPU处计算Mipmap Level,以自由控制加载。Unity提供了Texture2D.requestedMipmapLevel方法来实现这一点。然而,这种方法实现起来相对复杂,需要考虑性能消耗和资源管理等问题。应用限制:Texture Streaming并非适用于所有场景和纹理。例如,UI纹理和需要开启Read/Write的纹理通常无法设置为Streaming。此外,Memory Budget和MaxLevelReduction两个参数的设置也对优化效果有很大影响。因此,在应用Texture Streaming时需要根据具体情况进行调整和优化。总结Mipmap和Texture Streaming是Unity中两种重要的纹理优化技术。Mipmap通过生成不同分辨率的纹理层级来提高渲染质量,而Texture Streaming则通过动态加载和卸载纹理层级来优化内存占用和渲染性能。在实际应用中,需要根据具体场景和需求选择合适的技术,并进行相应的调整和优化。



































