Unity3D:Mipmap 流媒体系统

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
Mipmap 流媒体系统
Mipmap 流送系统可让您控制 Unity 加载 mipmap 的方式。
本页包含以下信息:
- 概述
- 开始
- 启用 Mipmap 流
- 使纹理与 Mipmap 流送系统配合使用
- 使光照贴图与 Mipmap 流处理系统配合使用
- 配置 Mipmap 流
- 设置内存预算
- 配置摄像机
- 配置播放模式行为
- 调试
- Unity 如何计算所需的 mip 级别
- 局限性
有关使用 API 扩展此系统功能的信息,请参阅 Mipmap 流系统 API。
概述
此系统强制 Unity 仅加载渲染当前摄像机位置所需的 mip 关卡,而不是默认加载所有关卡。它交易少量 CPU 资源以节省潜在的大量 GPU 内存。
您可以为应用程序中的所有纹理设置总内存限制,系统会自动降低 mip 级别以保持在此预算范围内。
在 Unity 的 Viking Village 演示项目中,Mipmap 流送系统可节省 25–30% 的纹理内存,具体取决于摄像机位置。

准备开始
启用 Mipmap 流
要启用 Mipmap 流送,请转到 Unity 的质量设置(编辑>项目设置>质量)并启用纹理流送复选框。
启用此设置时,“质量设置”窗口将显示特定于 Mipmap 流系统的设置。有关每个设置的详细信息,请参阅有关质量设置的文档。

默认情况下,这将为项目中的所有摄像机启用 Mipmap 流送。
使纹理与 Mipmap 流送系统配合使用
现在,您可以在单个纹理上设置 Mipmap 流。选择纹理资源,导航到“检查器”窗口并查看“纹理导入”设置。打开“高级设置”,然后启用“流式处理 Mip 映射”复选框。
如果您正在为 Android 进行开发,则还需要打开“构建设置”并将“压缩方法”设置为 LZ4 或 LZ4HC。Unity 需要其中一种压缩方法来异步纹理加载,而 Mipmap 流送系统正是依赖这些方法的。
Unity 在观察内存预算的同时,以尽可能高的分辨率加载 MIPS。您可以使用纹理导入设置中的 Mip 贴图优先级设置配置纹理的优先级。
Unity 使用此设置来确定:
- 分配资源时要优先考虑哪些纹理。
- 作为选择适合内存预算的 mip 级别的 mip 偏置值。例如,优先级为 2 时,mipmap 流系统尝试使用优先级为 0 的纹理高两个 mip 级别的 mipmap。
正数表示更高的优先级。有效值范围为 –128 到 127。
流式处理光照贴图
您可以使用 Mipmap 流送系统流式传输光照贴图的 mip 关卡。
您可以像编辑任何其他纹理一样编辑光照贴图资源的 Mip 贴图流处理设置,但在 Unity 重新生成光照贴图时,它们会重置为其默认值。要解决此问题,您可以告诉 Unity 在生成光照贴图时应用这些值。播放器设置(>播放器编辑>项目设置)提供了两个控件来设置生成的光照贴图的流处理和优先级:“启用光照贴图流送”和“流处理优先级”。
启用 Mip 贴图流式处理和配置优先级的工作方式与光照贴图与常规纹理相同。
配置 Mipmap 流
您可以在 Unity 编辑器中配置默认设置,然后根据需要使用 Mipmap 流式处理 API 覆盖这些设置。
设置内存预算
内存预算属性确定 Unity 用于纹理的最大内存量。如果内存预算太小,Unity 会降低场景中纹理的分辨率。这可能会导致纹理弹出或加载缓慢。但是,内存预算应尽可能小,以便为其他资源提供内存。
在“质量设置”窗口中设置内存预算,使用“纹理流>内存预算”属性。
当内存预算已满时,Unity 会丢弃不使用的 mipmap,以便为需要使用的 mipmap 腾出空间。您可以使用最大等级降低来控制它丢弃的未使用的 mipmap 数量。
此值也是 Mipmap 流系统最初在启动时加载的 mipmap 级别。例如,当此值设置为 2 时,Unity 会在首次加载时跳过两个最高的 mipmap。
在“质量设置”窗口中设置此值,并使用“纹理流处理>最大级别降低”属性。
注意:Unity 将最大级别降低值优先于内存预算。它永远不会丢弃超过最大级别缩减值的 mipmap,即使这会导致纹理内存超出预算。
内存预算包括不使用 Mipmap 流处理的纹理。例如,如果您的预算为 100MB,并且您有 90MB 的纹理不使用 Mipmap 流送,Unity 会尝试将所有流处理的 mipmap 放入剩余的 10MB 中。如果不能,它会以较低的分辨率加载它们。Unity 始终以全分辨率加载不使用 Mipmap 流送的纹理,即使这超出了预算。
要确定您的内存预算的合理数量:
- 在项目运行时查看 Texture.desiredTextureMemory 值。
- 将 Memory Budget 值设置为略高于Texture.desiredTextureMemory 的值。
这确保有足够的纹理内存可用于场景中资源最密集的区域,并防止纹理下降到较低的分辨率。 如果您有额外的可用内存,可以设置更大的内存预算,以便 Unity 可以将场景中不可见的纹理数据保留在串流缓存中。
配置摄像机
默认情况下,当您启用 Mipmap 流送系统时,Unity 会为所有摄像机启用它。如果您愿意,可以禁用此设置。
使用 “纹理流送>添加所有摄像机”属性,控制 Unity 是否在“质量设置”窗口中为所有摄像机启用 mipmap 流送。
如果要排除特定摄像机,请将流控制器组件添加到该摄像机,然后将其禁用。
如果禁用“添加所有摄像机”,则必须启用每个摄像机的 mipmap 流式传输。为此,请将流控制器组件添加到与相机组件相同的游戏对象。
此组件还允许您调整每个摄像机的 mip 偏置设置。

配置播放模式行为
默认情况下,Mipmap 流式处理在播放模式下处于启用状态。
使用 “流设置”>“在运行模式下启用纹理流”属性,控制 Unity 是否在“编辑器设置”窗口中启用“运行模式下的 Mipmap 流送”。
如果在播放模式下启用了 Mipmap 流,但在编辑模式下未启用(反之亦然),则切换进入和退出播放模式需要稍长的时间。这会阻止 Unity 卸载和重新加载 mipmap 数据,并应加快运行模式工作流程。

调试 Mipmap 串流
Unity 具有内置的 Mipmap 串流调试视图模式。 要访问此模式,请单击 Scene 视图控制下拉选单,然后选择 Texture Streaming。 根据游戏对象在 Mipmap 串流系统中的状态,此视图模式将其显示为以下颜色:
- 绿色表示由于 Mipmap 串流系统而降低了 Mipmap 的纹理。
- 红色表示由于 Mipmap 串流系统没有足够资源来加载全部 Mipmap 而减少了 Mipmap 的纹理。
- 蓝色表示未设置为串流的纹理,或者在没有渲染器计算 Mip 级别的情况下的纹理。
您还可以使用调试 API 编写您自己的自定义调试工具。
重要提示:使用 MainTexture 属性设置主纹理时,当您使用纹理流调试视图模式或自定义调试工具时,主纹理在游戏视图中不可见。
Unity 如何计算所需的 mip 级别
对于使用 Mipmap 流送的纹理,Unity 使用以下方法之一计算正确的 mip 级别:
- 如果将纹理分配给 Unity 渲染器组件使用的材质,Unity 会自动计算 mip 级别。
- 否则,您必须使用 Texture2D.requestMipmapLevel 手动请求 mip 级别。
如果不这样做,Unity 将无法计算出正确的 mip 级别,并且它会使用低质量的 mip 加载纹理。这些可能看起来很模糊。
注意:以下系统不使用标准渲染器组件。这意味着您必须为这些系统手动设置请求的 mips:
- 贴花投影仪纹理。
- 反射探针纹理:较低分辨率的 mips 是粗糙度的查找表。因此,如果 Unity 使用较低的 mipmap 级别,则会使用错误的粗糙度渲染材质。
- 在 Mesh.uv(也称为 UV0)以外的通道中使用 UV 纹理坐标或在着色器中更改纹理坐标的着色器。唯一的例外是比例和翻译的变化(见下文)。
限制
- Unity 不支持地形纹理上的 Mipmap 流送。这是因为地形纹理需要始终以全分辨率提供,以允许 Unity 平铺和混合纹理。
- 当渲染器组件处于活动状态时,其网格需要有效的 UV 分布指标来计算所需的 mip 级别。Unity 会在网格导入过程中自动计算分布指标。
如果从代码创建网格,Unity 不会自动计算分布指标,因此会加载错误的 mip 级别。要手动触发 UV 分布指标计算,请使用 Mesh.RecalculateUVDistributionMetrics。 - 当 Unity 直接使用 API(例如 Graphics.DrawMeshNow)渲染流纹理时,系统没有渲染器边界或其他信息来计算 mip 级别。这意味着您需要手动设置纹理 mip 级别或在此纹理上禁用 Mipmap 流式处理。请参阅 Texture2D.requestMipmapLevel 了解有关如何手动设置 Unity 加载的 mip 级别的更多详细信息。
- 当 Unity 计算纹理的 miplevel 时,它会在与着色器中标记的纹理同名的值中查找该纹理的比例和平移。例如,如果使用着色器中引用纹理,Unity 将查找 。
_ST_MainTex_MainTex_ST
由3D建模学习工作室整理翻译,转载请注明出处!