Three.js - 材质(六)

995 阅读3分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

材质(Material)

  • 材质简单理解就是设置几何体各个面的颜色。但它不是单纯的颜色,它能模拟在不同光照下颜色的表现。比如太阳光照射光滑的物体,表面会出现白色的反光,都能模拟。
  • 材质和渲染器无关,在开发中定义一份材质就可以重复使用。
  • 定义材质的常用的方式有两种:
  1. 在实例化时传入要配置的参数。
    const material = new THREE.MeshPhongMaterial({
        color: 0xFF0000, // 也可以使用CSS的颜色字符串
    });
  1. 通过材质的方法设置属性。
    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)

1.gif

  1. wireframe 基础材质的属性,设置true,只渲染线框。其它属性大家可以到官网查看
  2. 创建球几何体使用基础材质,和平面没撒区别。
  3. 通常用于显示几何体线框时使用。

MeshLambertMaterial Lambert网格材质

  • 表面光滑的材质。
  • 受灯光的影响,不过只在顶点计算光照。
  • 能很好的模拟一些表面(例如未经处理的木材或石材)。因为只在顶点计算光照,不能模拟具有镜面高光的表面(如地板砖这些)。
      // 基础材质
      const material = new THREE.MeshLambertMaterial({ color: 0x44aa88 })
      // 网格
      const mesh = new THREE.Mesh(sphereGeometry, material)
      mesh.position.x = 5
      scene.add(mesh)

1.gif

  1. 这里灯光用的方向光黑色,不设置灯光几何体就会展示为全黑。几何体最后展示的颜色是,灯光颜色乘以材质的颜色来展示的。灯光会在后面讲解。
  2. emissive是材质的属性,用于设置材质发出的颜色,这种颜色不受光照影响。

MeshPhongMaterial Phong网格材质

  • 具有镜面高光的材质。
  • 每个像素都会计算光照。
  • 模拟具有镜面高光的表面(如地板砖)。
      // 基础材质
      const material = new THREE.MeshPhongMaterial({ color: 0x44aa88 })
      // 网格
      const mesh = new THREE.Mesh(sphereGeometry, material)
      mesh.position.x = 5
      scene.add(mesh)

1.gif

  1. shininess属性,决定高光的光泽,值越大光泽越亮。默认是30。

总结

这里只介绍了常用的3种材质和基本用法。在three.js中越复杂的材质会消耗更多的GPU功耗。在绘制物体时我们就需要判断需要那些材质功能,找到对应的材质以此来减少程序的消耗。本节我们忽略了纹理,只使用了基本的颜色来展示,在开发中纹理和材质配合使用能实现更多有趣的功能。