「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」
材质(Material)
材质简单理解就是设置几何体各个面的颜色。但它不是单纯的颜色,它能模拟在不同光照下颜色的表现。比如太阳光照射光滑的物体,表面会出现白色的反光,都能模拟。材质和渲染器无关,在开发中定义一份材质就可以重复使用。- 定义材质的常用的方式有两种:
- 在实例化时传入要配置的参数。
const material = new THREE.MeshPhongMaterial({
color: 0xFF0000, // 也可以使用CSS的颜色字符串
});
- 通过材质的方法设置属性。
const material = new THREE.MeshPhongMaterial();
material.color.setHSL(0, 1, 0.5);
material.color.set(0x00FFFF); // 同 CSS的 #RRGGBB 风格
- 在
three.js中定义了很多材质,接下来我们看看那些常用的材质。
MeshBasicMaterial 基础材质
- 以简单着色的方式实现。
- 不受灯光的影响。
const color = 0xeeeeee
const intensity = 1
// 创建光源
const light = new THREE.DirectionalLight(color, intensity)
// 光源 加入场景
scene.add(light)
// 基础材质
const material = new THREE.MeshBasicMaterial({ color: 0x44aa88 })
// 网格
const mesh = new THREE.Mesh(sphereGeometry, material)
mesh.position.x = 10
scene.add(mesh)
// 基础材质
const material2 = new THREE.MeshBasicMaterial({ color: 0x44aa88, wireframe: true })
// 网格
const mesh2 = new THREE.Mesh(sphereGeometry, material2)
mesh2.position.x = 0
scene.add(mesh2)
wireframe基础材质的属性,设置true,只渲染线框。其它属性大家可以到官网查看- 创建球几何体使用基础材质,和平面没撒区别。
- 通常用于显示几何体线框时使用。
MeshLambertMaterial Lambert网格材质
- 表面光滑的材质。
- 受灯光的影响,不过只在顶点计算光照。
- 能很好的模拟一些表面(例如未经处理的木材或石材)。因为只在顶点计算光照,不能模拟具有镜面高光的表面(如地板砖这些)。
// 基础材质
const material = new THREE.MeshLambertMaterial({ color: 0x44aa88 })
// 网格
const mesh = new THREE.Mesh(sphereGeometry, material)
mesh.position.x = 5
scene.add(mesh)
- 这里灯光用的方向光黑色,不设置灯光几何体就会展示为全黑。几何体最后展示的颜色是,灯光颜色乘以材质的颜色来展示的。灯光会在后面讲解。
emissive是材质的属性,用于设置材质发出的颜色,这种颜色不受光照影响。
MeshPhongMaterial Phong网格材质
- 具有镜面高光的材质。
- 每个像素都会计算光照。
- 模拟具有镜面高光的表面(如地板砖)。
// 基础材质
const material = new THREE.MeshPhongMaterial({ color: 0x44aa88 })
// 网格
const mesh = new THREE.Mesh(sphereGeometry, material)
mesh.position.x = 5
scene.add(mesh)
shininess属性,决定高光的光泽,值越大光泽越亮。默认是30。
总结
这里只介绍了常用的3种材质和基本用法。在three.js中越复杂的材质会消耗更多的GPU功耗。在绘制物体时我们就需要判断需要那些材质功能,找到对应的材质以此来减少程序的消耗。本节我们忽略了纹理,只使用了基本的颜色来展示,在开发中纹理和材质配合使用能实现更多有趣的功能。