一、前言
材质和纹理有那么一点微妙的关系,纹理决定了物体的表面,而材质则决定了物体的“气质”,比如说,反射度,光滑度,金属感,塑料感或者玻璃的模仿等。当然,在 ThreeJs 中,纹理想要被展示出来是要被依附在材质中的。
二、概述
ThreeJs 中定义了非常丰富的材质,其类图如下。
Material.jpg从类图上看,定义了非常多的材质。
三、认识材质
1.Material
MaterialXmind.jpg2.LineBasicMaterial
LineBasicMaterial.jpg LineBasicMaterialSample.jpg3.LineDashedMaterial
LineDashedMaterial.jpgvar material = new THREE.LineDashedMaterial( {
color: 0xffffff,
linewidth: 1,
scale: 1,
dashSize: 3,
gapSize: 1,
} );
LineDashedMaterialSample.jpg
4.MeshBasicMaterial
MeshBasicMaterial.jpg MeshBasicMaterialSample.jpg5.MeshDepthMaterial
MeshDepthMaterial.jpg MeshDepthMaterialSample.jpg6.MeshLambertMaterial
MeshLambertMaterial.jpg MeshLambertMaterialSample.jpg7.MeshNormalMaterial
MeshNormalMaterial.jpg MeshNormalMaterialSample.jpg8.MeshPhongMaterial
MeshPhongMaterial.jpg MeshPhongMaterialSample.jpg9.MeshPhysicalMaterial
MeshPhysicalMaterial.jpg MeshPhysicalMaterialSample.jpg10.MeshStandardMaterial
MeshStandardMaterial.jpg MeshStandardMaterialSample.jpg11.MeshToonMaterial
MeshToonMaterial.jpg MeshToonMaterialSample.jpg12.PointsMaterial
PointsMaterial.jpgPointsMaterialSample.jpg
13.RawShaderMaterial
RawShaderMaterial.jpgvar material = new THREE.RawShaderMaterial( {
uniforms: {
time: { value: 1.0 }
},
vertexShader: document.getElementById( 'vertexShader' ).textContent,
fragmentShader: document.getElementById( 'fragmentShader' ).textContent,
} );
RawShaderMaterialSample.jpg
14.ShaderMaterial
ShaderMaterial.jpgvar 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.jpgvar 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.jpgvar 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。
网友评论