材质

Posted by Chris Lu on 2017-04-08

材质=材料+质感。光照射到物体上折射出不同的颜色、光强等,人眼才能感知物体的材质。构建材质的过程可以看作是操作改造反射光的过程。

将入射光比作原材料,物体比作工厂,反射光比作产品,人眼比作消费者。
那么材质就是工厂里的装配机器。
机器对入射光进行装配雕琢,改变其颜色、方向、强度等属性之后以反射光出厂,人眼消费后感知反射光反应的信息——物体材质。

WebGL将大自然中的材质抽象出来,ThreeJs做了划分,下面就来看看阿3是怎么划分材质的。

0. 材质

  • Material
    材质基类,抽象了材质的基本属性,不列举全部属性。
    感光(lights):物体什么颜色就反射什么颜色的光。
    雾化(fog):是否受雾化影响。
    透明(transparent):是否透明。
    可视(visible):是否可见。
    透明度(opacity):透明度。
    阿尔法值(alphaTest):若opacity小于alpha值则不会渲染材质。
    混淆、混淆方程式、混淆目标等:不明白。
    平面剪裁:不明白。
    颜色(colorWrite):是否进行颜色渲染。
    材质更新(needsUpdate):是否实时更新材质变化。
    理论上基类的属性子类都会继承,但实际中并不是每个属性在具体子类上都会有效果。比如雾化对ShadowMaterial来说就无意义。

1. 点材质

  • PointsMaterial
    一个点的属性:颜色(color)、感光(lights)、大小(size),另外在阿3中还可以设置尺寸衰减(sizeAttenuation,近大远小)。

2. 线材质

两种线条:虚线 和 实线。
基本属性:颜色(color)、感光(lights)、粗细(linewidth)。

  • LineBasicMaterial
    一根普通线条的属性:基本属性、末端结束方式(linecap)、连接方式(linejoin)。
  • LineDashedMaterial
    一根虚线条的属性:基本属性、实部长度(dashSize)、虚部长度(gapSize)、虚线范围(scale)。

3. 面材质

从点到线,再到面,属性就更加丰富了。
面的基本属性:感光(lights)。

  • SpriteMaterial
    sprite是一个总是面向相机的平面。
    其材质属性:基本属性、颜色(color)、雾化(fog)、纹理映射(map)、旋转角度(rotation)。
  • ShadowMaterial
    继承自ShaderMaterial,可以接受物体投影呈现出阴影。
    属性:基本属性、透明(transparent)。

4. 物体材质

  • MeshBasicMaterial
    用在绘制简单轮廓的时候。比如物体扁平化(flat)或则仅线框。
    默认不感光,无质感。
    属性列举不全:线框模式(wireframe)、反射光模式(reflectivitycombine)。
  • MeshDepthMaterial
    根据参数parameters创建基于相机远近裁切面自动变换亮度(明暗度)的材质类型,离相机越近,材质越亮(白),离相机越远,材质越暗(黑)。
    默认不感光,无质感。体现的是远近,白色表示最近,黑色表示最远。
  • MeshLambertMaterial
    表面均匀,粗糙,比如一张纸。
    其特点是能产生漫反射,有光泽,表面凹凸呈现出不同的阴暗效果。
  • MeshPhongMaterial
    有光泽的材质,比如塑料、金属,可以从某个方向上看到很强的反射光。

    镜面反射的光强与反射光线和视角的夹角相关。
  • MeshToonMaterial
    使用了Toon Shader的MeshPhongMaterial的扩展,或叫做物体拥有高光。
    Toon Shader又被叫做Cel Shader,这种效果能让物体看上去有卡通的感觉,很神奇吧!
  • MeshNormalMaterial
    将普通的向量映射成RGB值,呈现出相应色彩。
  • MeshStandardMaterial
    标准物体材质,可设置其粗糙度、颜色、纹理、光感等属性,理论上讲,Lambert和Phong材质效果可以通过该API构建出来。
  • MeshPhysicalMaterial
    MeshStandardMaterial的扩展,更好地控制反射率(高光)。
  • MultiMaterial
    给同一个物体设置多个材质,比如一个立方体的六个面设置六种材质。
    参数接受一个material数组。
  • RawShaderMaterial
    继承自ShaderMaterial,自定义的uniforms和attribute属性不会自动追加到GLSL着色器代码中
  • ShaderMaterial
    以着色器的方式自定义材质,用户可借此扩充材质类型。

持续完善中…