Three.js 材质系统总结笔记

Three.js 材质系统总结笔记

一、金属度 (metalness) 与粗糙度 (roughness)

金属度 (metalness)

  • 范围: 0.0 ~ 1.0
  • 作用: 控制材质的金属外观程度
  • 效果 :
    • 0.0: 完全非金属(如塑料、木材、陶瓷)
    • 0.5: 半金属效果
    • 1.0: 完全金属(如钢铁、铝、铜)
  • 特性 :
    • 金属材质会反射环境光
    • 高金属度时,漫反射颜色会变暗,反射效果增强

粗糙度 (roughness)

  • 范围: 0.0 ~ 1.0
  • 作用: 控制材质表面的光滑程度
  • 效果 :
    • 0.0: 镜面般光滑(高反射,清晰反射)
    • 0.5: 中等粗糙(模糊反射)
    • 1.0: 完全粗糙(几乎无反射,漫反射为主)
  • 特性 :
    • 低粗糙度产生锐利的高光和清晰的反射
    • 高粗糙度产生柔和的光泽和模糊的反射

组合效果示例

金属度 粗糙度 效果描述 应用场景
1.0 0.1~0.3 抛光金属 不锈钢、镀铬表面
1.0 0.4~0.6 普通金属 机器零件、工具
1.0 0.7~1.0 锈蚀/磨损金属 旧金属、铸铁
0.0 0.0~0.3 光滑非金属 陶瓷、抛光塑料
0.0 0.4~0.7 普通非金属 木材、普通塑料
0.0 0.8~1.0 粗糙非金属 布料、粗陶

二、环境贴图 (Environment Map)

作用与原理

  1. 提供环境反射: 模拟物体对周围环境的反射
  2. 增强真实感: 创建材质与环境的互动
  3. 补光作用: 提供额外的环境照明

CubeTextureLoader 使用

javascript 复制代码
const textureCube = new THREE.CubeTextureLoader()
    .setPath('/路径/')
    .load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);

配置参数

  • envMap: 环境贴图纹理
  • envMapIntensity : 环境贴图强度 (默认1.0)
    • 值越大,反射越强
    • 建议范围: 0.5~2.0

注意事项

  1. 文件命名规范: 六个面按顺序排列
  2. 贴图质量: 影响反射效果的真实度
  3. 性能考虑: 高分辨率贴图会增加内存占用

三、MeshPhysicalMaterial 高级属性

clearcoat(清漆效果)

  • 作用: 模拟表面涂层效果
  • clearcoat: 清漆强度 (0.0~1.0)
  • clearcoatRoughness: 清漆层粗糙度 (0.0~1.0)
  • 应用: 汽车漆、塑料涂层、光油表面

reflectivity(反射率)

  • 作用: 控制材质的反射能力
  • 范围: 0.0~1.0
  • 配合: 通常与envMap一起使用

四、Three.js 主要材质对比

1. MeshBasicMaterial(基础材质)

javascript 复制代码
new THREE.MeshBasicMaterial({
    color: 0xffffff,
    side: THREE.DoubleSide
})
  • 特点: 不受光照影响,恒定颜色
  • 用途: 简单几何体、背景、特效
  • 性能: 最高

2. MeshLambertMaterial(朗伯材质)

javascript 复制代码
new THREE.MeshLambertMaterial({
    color: 0xffffff
})
  • 特点: 对光照有反应,漫反射
  • 用途: 哑光表面、不反光物体
  • 性能: 中等

3. MeshPhongMaterial(冯氏材质)

javascript 复制代码
new THREE.MeshPhongMaterial({
    color: 0xffffff,
    shininess: 30  // 高光强度
})
  • 特点: 支持镜面高光
  • 用途: 塑料、光泽表面
  • 性能: 较低

4. MeshStandardMaterial(标准材质)

javascript 复制代码
new THREE.MeshStandardMaterial({
    color: 0xffffff,
    metalness: 0.5,
    roughness: 0.5
})
  • 特点: 基于物理的渲染(PBR)
  • 用途: 现代渲染,真实感强
  • 性能: 较低

5. MeshPhysicalMaterial(物理材质)

javascript 复制代码
new THREE.MeshPhysicalMaterial({
    color: 0xffffff,
    metalness: 1.0,
    roughness: 0.35,
    clearcoat: 0.5,
    envMap: textureCube
})
  • 特点: MeshStandardMaterial的扩展,更多PBR参数
  • 用途: 高级真实感渲染
  • 性能: 最低(但效果最好)

五、材质选择指南

根据需求选择

需求场景 推荐材质 关键参数
简单展示,不需要光照 MeshBasicMaterial color, side
哑光表面,需要漫反射 MeshLambertMaterial color, emissive
光泽塑料,需要高光 MeshPhongMaterial color, shininess
真实感渲染,PBR流程 MeshStandardMaterial metalness, roughness
高级金属/清漆效果 MeshPhysicalMaterial clearcoat, envMap

性能考虑

  1. 优先级排序(性能从高到低):

    • MeshBasicMaterial
    • MeshLambertMaterial
    • MeshPhongMaterial
    • MeshStandardMaterial
    • MeshPhysicalMaterial
  2. 优化建议:

    • 简单物体用基础材质
    • 复杂场景混合使用不同材质
    • 避免所有物体都用物理材质

六、实用技巧

1. 颜色处理

javascript 复制代码
// 保存原始颜色
child.userData.selfColor = new THREE.Color().setHex(
    originalColor.getHex ? originalColor.getHex() : originalColor
);

// 恢复原始颜色
child.material.color.copy(child.userData.selfColor);

2. 材质调试

javascript 复制代码
// 添加GUI控制
const gui = new GUI();
gui.add(material, 'metalness', 0, 1).step(0.01);
gui.add(material, 'roughness', 0, 1).step(0.01);
gui.add(material, 'envMapIntensity', 0, 2).step(0.1);

3. 环境贴图优化

javascript 复制代码
// 预过滤环境贴图(提高性能)
pmremGenerator = new THREE.PMREMGenerator(renderer);
pmremGenerator.compileCubemapShader();

总结要点

  1. 金属度+粗糙度是PBR渲染的核心参数
  2. 环境贴图显著提升真实感
  3. 物理材质适合高质量渲染但消耗性能
  4. 根据实际需求平衡效果与性能
  5. 合理使用清漆、反射率等高级特性

通过合理组合这些参数,可以创建从简单到高度真实的各类材质效果。

相关推荐
GIS遥遥1 小时前
2025Cesium进阶教程(5)| webgis智慧城市开发,大屏可视化行政区高亮
javascript·cesium·gis开发·三维gis·webgis开发
干就完了11 小时前
关于git的操作命令(一篇盖全),可不用,但不可不知!
前端·javascript
zore_c1 小时前
【C语言】文件操作详解3(文件的随机读写和其他补充)
c语言·开发语言·数据结构·笔记·算法
hjt_未来可期1 小时前
js实现替换输入框中选中的文字
javascript·vue.js
之恒君1 小时前
JavaScript 垃圾回收机制详解
前端·javascript
是你的小橘呀1 小时前
像前任一样捉摸不定的异步逻辑,一文让你彻底看透——JS 事件循环
前端·javascript·面试
Tzarevich1 小时前
JavaScript 继承与 `instanceof`:从原理到实践
javascript
前端老宋Running1 小时前
你的代码在裸奔?给 React 应用穿上“防弹衣”的保姆级教程
前端·javascript·程序员
前端老宋Running1 小时前
“求求你别在 JSX 里写逻辑了” —— Headless 思想与自定义 Hook 的“灵肉分离”术
前端·javascript·程序员