一、前言
材质和纹理有那么一点微妙的关系,纹理决定了物体的表面,而材质则决定了物体的“气质”,比如说,反射度,光滑度,金属感,塑料感或者玻璃的模仿等。当然,在 ThreeJs 中,纹理想要被展示出来是要被依附在材质中的。
二、概述
ThreeJs 中定义了非常丰富的材质,其类图如下。
Material.jpg
从类图上看,定义了非常多的材质。
三、认识材质
1.Material
MaterialXmind.jpg
2.LineBasicMaterial
LineBasicMaterial.jpg
LineBasicMaterialSample.jpg
3.LineDashedMaterial
LineDashedMaterial.jpg
var material = new THREE.LineDashedMaterial( {
color: 0xffffff,
linewidth: 1,
scale: 1,
dashSize: 3,
gapSize: 1,
} );
LineDashedMaterialSample.jpg
4.MeshBasicMaterial
MeshBasicMaterial.jpg
MeshBasicMaterialSample.jpg
5.MeshDepthMaterial
MeshDepthMaterial.jpg
MeshDepthMaterialSample.jpg
6.MeshLambertMaterial
MeshLambertMaterial.jpg
MeshLambertMaterialSample.jpg
7.MeshNormalMaterial
MeshNormalMaterial.jpg
MeshNormalMaterialSample.jpg
8.MeshPhongMaterial
MeshPhongMaterial.jpg
MeshPhongMaterialSample.jpg
9.MeshPhysicalMaterial
MeshPhysicalMaterial.jpg
MeshPhysicalMaterialSample.jpg
10.MeshStandardMaterial
MeshStandardMaterial.jpg
MeshStandardMaterialSample.jpg
11.MeshToonMaterial
MeshToonMaterial.jpg
MeshToonMaterialSample.jpg
12.PointsMaterial
PointsMaterial.jpg
PointsMaterialSample.jpg
13.RawShaderMaterial
RawShaderMaterial.jpg
var material = new THREE.RawShaderMaterial( {
uniforms: {
time: { value: 1.0 }
},
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent,
} );
RawShaderMaterialSample.jpg
14.ShaderMaterial
ShaderMaterial.jpg
var material = new THREE.ShaderMaterial( {
uniforms: {
time: { value: 1.0 },
resolution: { value: new THREE.Vector2() }
},
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent
} );
ShaderMaterialSample.jpg
15.ShadowMaterial
ShadowMaterial.jpg
var planeGeometry = new THREE.PlaneGeometry( 2000, 2000 );
planeGeometry.rotateX( - Math.PI / 2 );
var planeMaterial = new THREE.ShadowMaterial();
planeMaterial.opacity = 0.2;
var plane = new THREE.Mesh( planeGeometry, planeMaterial );
plane.position.y = -200;
plane.receiveShadow = true;
scene.add( plane );
ShadowMaterialSample.jpg
16.SpriteMaterial
SpriteMaterial.jpg
var spriteMap = new THREE.TextureLoader().load( 'textures/sprite.png' );
var spriteMaterial = new THREE.SpriteMaterial( { map: spriteMap, color: 0xffffff } );
var sprite = new THREE.Sprite( spriteMaterial );
sprite.scale.set(200, 200, 1)
scene.add( sprite );
SpriteMaterialSample.jpg
四、总结
ThreeJs 的内置材质非常的多,项目里可以根据需要来实际使用。如果内置的不能满足则使用 ShaderMaterial 来实现自定义的 Material。