Unity3D:The Mipmap Streaming system API

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

The Mipmap Streaming system API

使用此 API 可覆盖 Mipmap 流式处理系统中的默认设置,或获取更精细的控制。

本页包含以下信息:

  • 概述
  • 控制 Mipmap 流系统
  • 控制摄像机
  • 加载特定的 mip 级别
  • 调试和分析
  • 相关的统一 API 方法

有关此系统的一般信息,请参阅 Mipmap 流系统。

概述

您可以使用 API 覆盖特定情况下的行为,而 Mipmap 流系统会自动管理默认设置。

如果您知道 Unity 需要完全加载某些纹理,这将非常有用;例如,如果它们与快速移动长距离的游戏对象相关,或者如果您使用瞬时摄像机剪切。

控制 Mipmap 流系统

要在纹理上启用和控制 Mipmap 流送,请使用以下属性:

  • TextureImporter.streamingMipmaps
  • TextureImporter.streamingMipmapsPriority
  • IHVImageFormatImporter.streamingMipmaps
  • IHVImageFormatImporter.streamingMipmapsPriority

Mipmap 流送会自动降低纹理的 mip 级别,直到它们适合 Mipmap 流内存预算。纹理的 mip 贴图优先级编号大致是内存预算的 mipmap 偏移量。例如,优先级为 2 时,Mipmap 流处理系统尝试使用比优先级为 0 的其他纹理高两个 mip 级别的 mip。负值也是有效的。如果无法执行此操作,则使用较低的 mip 级别来适应内存预算

以下属性在运行时为只读:

  • SystemInfo.supportsMipStreaming
  • Texture2D.streamingMipmaps
  • Texture2D.streamingMipmapsPriority

要控制运行时的行为,请使用以下静态属性:

  • QualitySettings.streamingMipmapsActive
  • QualitySettings.streamingMipmapsMemoryBudget(默认为 512 MB)
  • QualitySettings.streamingMipmapsRenderersPerFrame(默认为 512)
  • QualitySettings.streamingMipmapsMaxLevelReduction(默认为 2)
  • QualitySettings.streamingMipmapsMaxFileIORequests(默认为 1024)
  • Texture2D.streamingTextureDiscardUnusedMips(默认为 false)。

控制摄像机

从一个位置剪切到另一个位置时,Mipmap 流送系统需要时间将所需的纹理流式传输到 Unity 中。若要在禁用的目标摄像机位置触发预加载,请在目标摄像机的流式处理控制器组件上调用 StreamingController.SetPreload。您可以指定超时以结束预加载阶段。要在预加载阶段结束时自动启用摄像机,请在脚本中将标志设置为 true。要在从摄像机切换到新摄像机后禁用摄像机,请将该摄像机作为参数传递。activateCameraOnTimeoutdisableCameraCuttingFrom

void StreamingController.SetPreloading(float timeoutSeconds=0.0f, bool activateCameraOnTimeout=false, Camera disableCameraCuttingFrom=null)

要取消或查询预加载状态,请使用下列方法:

  • StreamingController.Cancel预加载
  • StreamingController.IsPreload

要确定 Mipmap 流系统是否仍在加载纹理,您可以查询以下属性:

  • Texture.streamingTextureLoadCount
  • Texture.streamingTexturePendingLoadCount

请注意,启用摄像机与这些属性变为零以外的值之间存在延迟。此延迟是因为 Mipmap 流系统使用时间切片处理计算 mip 映射。因此,在摄像机剪辑期间,您应该在剪辑前等待最短时间。纹理预算和场景移动可能会导致连续的 Mipmap 流送,因此您还需要在剪切前设置最大时间长度。

加载特定的 mip 级别

要覆盖特定纹理的 Mip 级别计算,请使用 Texture2D.requestedMipmapLevel。 这是一个精确的 Mip 级别,范围从 0 到特定纹理的最高 Mip 级别或者是 Max Level Reduction 值(如果该值更大)。 0 表示最高分辨率的 Mip。

要检查您请求的 Mip 级别是否已加载,请使用 Texture2D.IsRequestedMipmapLevelLoaded。

如果您不再希望覆盖您请求的 mip 级别,而是希望系统继续计算 mip 级别,请使用 Texture2D.ClearRequestMipmapLevel 重置该值。

要估算网格上的 UV 密度,请使用以下代码行:

float Mesh.GetUVDistributionMetric(int uvSetIndex)

可以使用 UV 分布指标根据摄像机的位置来计算所需的 Mipmap 级别。 请参阅 Mesh.GetUVDistributionMetric 以查看代码示例。

要覆盖系统并强制加载所有 Mip,请使用 Texture.streamingTextureForceLoadAll。

调试和分析

要获取可用于创建调试可视化的材质属性中每个纹理串流信息,请使用 Texture.SetStreamingTextureMaterialDebugProperties。

可以使用 Texture.SetStreamingTextureMaterialDebugProperties] 将每个纹理的流状态信息分配给材质属性。然后,可以在着色器中使用这些属性来创建调试可视化效果。

还可以使用这些属性为项目创建 Mipmap 流式分析和调试工具。

  • Texture.currentTextureMemory
  • Texture.desiredTextureMemory
  • Texture.totalTextureMemory
  • Texture.targetTextureMemory
  • Texture.nonStreamingTextureMemory

要获取有关 Mipmap 流送系统与之交互的纹理或渲染器数量的信息,请使用以下属性:

  • Texture.streamingMipmapUploadCount
  • Texture.nonStreamingTextureCount
  • Texture.streamingTextureCount
  • Texture.streamingRendererCount

要获取有关纹理的 Mipmap 级别的信息,请使用以下属性:

  • Texture2D.desiredMipmapLevel
  • Texture2D.loadMipmapLevel
  • Texture2D.loadedMipmapLevel

相关的统一 API 方法

要获取和设置分配给某一材质的纹理,请使用:

  • 材料.获取纹理
  • 材质.设置纹理

要获取某一材质中的所有纹理属性,请使用:

  • Material.GetTexturePropertyNames
  • Material.GetTexturePropertyNameID

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:Mipmap 流媒体系统 (mvrlink.com)

下一篇:Unity3D:流控制器组件 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号