Skip to content

材质与纹理的自动映射

glTF 的材质模型和 Bevy 的 StandardMaterial 几乎是一一对应的。加载器会自动完成映射,不需要手动转换。

glTF 材质 → StandardMaterial

glTF 属性StandardMaterial 字段说明
pbrMetallicRoughness.baseColorFactorbase_color固有色(RGBA)
pbrMetallicRoughness.baseColorTexturebase_color_texture固有色贴图
pbrMetallicRoughness.metallicFactormetallic金属感
pbrMetallicRoughness.roughnessFactorperceptual_roughness粗糙度
pbrMetallicRoughness.metallicRoughnessTexturemetallic_roughness_texture金属-粗糙度贴图
normalTexturenormal_map_texture法线贴图
emissiveFactoremissive自发光颜色
emissiveTextureemissive_texture自发光贴图
occlusionTextureocclusion_texture环境光遮蔽贴图
alphaModealpha_modeOpaque / Blend / Mask
doubleSidedcull_mode双面渲染

Bevy 的 PBR 渲染管线(第 24 章详述)直接消费这些字段。美术在 Blender 里调好的材质,导出 glTF 后在 Bevy 里看到的效果几乎一致。

纹理自动加载

glTF 文件里的纹理可以内嵌(.glb 二进制打包)或外部引用(.gltf + .png/.jpg)。无论哪种方式,加载器都会自动把纹理转成 Bevy 的 Image 资产,挂到对应的 StandardMaterial 字段上。

不需要手动加载纹理再赋值——整个过程对用户透明。

GltfMaterialName:按材质名查找

glTF 加载器会给每个网格实体附加一个 GltfMaterialName(String) 组件,记录该网格使用的材质名。第 23.6 节的材质覆写就靠它定位目标材质:

rust
use bevy::gltf::GltfMaterialName;

fn find_leather(query: Query<&GltfMaterialName>) {
    for name in &query {
        if name.0 == "LeatherPartsMat" {
            // found it
        }
    }
}

材质名来自 Blender 材质槽的命名。在 Blender 里给材质起有意义的名字,Bevy 里就能按名索引。

不支持的 glTF 扩展

Bevy 的 glTF 加载器支持大部分常用扩展(KHR_lights_punctualKHR_materials_unlitKHR_materials_ior 等),但不是全部。不支持的扩展会被忽略——不会报错,只是那些特性不生效。完整的支持列表见 bevy_gltf 的文档。