v3.0.0
Turian 3.0.0 改变了网格渲染器绑定材质的方式:按材质槽位,而不是按子网
格索引。网格渲染器现在绘制 materials[submesh.material_slot],因此一
个拥有数千个子网格但共享少数几个材质的模型,只需要那少数几个槽位。这正
是让展平成一个网格的整个场景——数百种材质——能够完整渲染,而不是在前
32 个处停止的原因。
变更内容
MeshRendererComponent——materials数组现在按材质槽位 (Submesh.material_slot)索引,而不是按子网格索引。GPU 渲染器和软件 渲染器都会查找materials[submesh.material_slot]。- 材质上限 —— 每个渲染器的限制从 32 提升到 160
(
MAX_MATERIALS)。拥有超过 32 个材质的网格现在会全部绑定并渲染。 - GPU 子网格 —— 不再限制为 32 个;一个网格的所有子网格每帧都会被绘 制。
- 场景文件 ——
material_guids现在按材质槽位存储(此前是按子网 格)。场景的version字段从1升级到2。 - 烹饪后的网格格式(TMSH)未变 —— 无需重新烹饪。只有场景/组件格式发 生了变化。
谁会受到影响
任何将材质分配给多材质模型的场景所在的项目,以及任何假定旧的按位置(按
子网格)绑定方式来读写 MeshRendererComponent.materials /
material_count 的游戏代码。
升级步骤
1. 更新到 3.0.0
下载 3.0.0 SDK。 SDK 是自包含的,因此在迁移期间你可以让 2.x SDK 与之并存(参见 发布政策)。
2. 迁移场景文件
旧场景仍然可以加载——v1 场景的材质绑定会在内存中重建,并记录一条警告。要
一次性对整个项目持久化这一转换,请在资源已至少导入过一次的项目上运行迁
移工具(在 Studio 中打开项目,或运行 turian-cli import,都会做到这一
点——迁移工具需要每个模型烹饪后的产物才能按槽位重建材质):
turian-cli migrate path/to/project
该命令会扫描每个场景,重写仍处于旧格式的场景,并报告它所修改的内容。请 提交生成的差异。(在 Studio 中打开场景也会在加载时迁移它,并将其标记为 已修改,因此保存也会将其持久化——CLI 只是批量版本。)
手动的逐子网格覆盖会被重置。 2.x 的逐子网格格式无法明确地映射到材 质槽位,因此迁移会根据模型的槽位默认值重建每个模型渲染器的表格, 并记录一条警告。如果你曾手动将非默认材质分配给某个特定子网格,请在迁 移后在检查器中按槽位重新分配。使用自动分配材质的项目(常见情况)不需 要进一步操作。
3. 更新游戏代码
如果你的代码按子网格索引分配或读取渲染器材质:
// 2.x —— materials[i] 绑定到子网格 i
renderer.materials[submesh_index] = my_material_ref;
// 3.0.0 —— materials[slot] 按子网格的 material_slot 绑定
renderer.materials[material_slot] = my_material_ref;
renderer.material_count = slot_count; // 唯一材质槽位的数量
单材质网格不受影响:materials[0] 仍然应用于整个网格(没有子网格表的网
格完全使用槽位 0 绘制)。未设置或超出范围的槽位会回退到默认材质。检查器
现在每个材质槽位显示一行。
4. 检查大型/展平模型
拥有超过 32 个子网格或材质的模型在 2.x 中会被裁剪——只绘制前 32 个子网 格。迁移后它们会完整渲染:预计会出现此前缺失的几何体,每个表面都拥有 自己的槽位材质。
之后不要降级
3.0.0 保存的场景存储按槽位的 material_guids 和 version: 2;2.x 会将
这些条目当作按子网格读取,并绑定错误的材质。项目只应向前迁移一次;如果
需要先做实验,请在分支上进行。