ThreeJS中的材质


参考:https://threejs.org/open in new window

目前ThreeJS中存在18种材质

材质描述了对象objects的外观。它们的定义方式与渲染器无关, 因此,如果您决定使用不同的渲染器,不必重写材质。

物体的创建

// 先创建物体的图元(Geometry)
const cubeGeometry =  new THREE.SphereGeometry(5, 16, 16)
// 创建物体的材质
const cubeMaterial =   new THREE.MeshPhongMaterial({
  color: 0xFF0000,    // 红色 (也可以使用CSS的颜色字符串)
  flatShading: true,
});
// 创建物理
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)

材质颜色

// 1
const material = new THREE.MeshPhongMaterial({
  color: 0xFF0000,    // 红色 (也可以使用CSS的颜色字符串)
  flatShading: true,
});
// 2 j
const material = new THREE.MeshPhongMaterial();
material.color.setHSL(0, 1, .5);  // 红色
// 定义材质是否使用平面着色进行渲染
material.flatShading = true;

颜色的设置

material.color.set(0x00FFFF);    // 同 CSS的 #RRGGBB 风格
material.color.set(cssString);   // 任何 CSS 颜色字符串, 比如 'purple', '#F32',
                                 // 'rgb(255, 127, 64)',
                                 // 'hsl(180, 50%, 25%)'
material.color.set(someColor)    // 其他一些 THREE.Color
material.color.setHSL(h, s, l)   // 其中 h, s, 和 l 从 0 到 1
material.color.setRGB(r, g, b)   // 其中 r, g, 和 b 从 0 到 1

const m1 = new THREE.MeshBasicMaterial({color: 0xFF0000});         // 红色
const m2 = new THREE.MeshBasicMaterial({color: 'red'});            // 红色
const m3 = new THREE.MeshBasicMaterial({color: '#F00'});           // 红色
const m4 = new THREE.MeshBasicMaterial({color: 'rgb(255,0,0)'});   // 红色
const m5 = new THREE.MeshBasicMaterial({color: 'hsl(0,100%,50%)'}); // 红色

材质的区别

材质类型效果与区别适用场景
BasicMaterial最简单的材质类型,只有漫反射颜色和高光反射高光亮度,默认情况下不会产生阴影用于简单场景或测试,渲染性能较好
LambertMaterial漫反射颜色和反光亮度,地面、墙壁等比较粗糙物体通常使用它用于不需要高光反射,需要高效渲染的场景
PhongMaterial拥有漫反射颜色、高光颜色和高光大小,并且可以设置光的颜色和强度等用于需要出现高光反射物体的场景
ToonMaterial类似卡通或手绘风格的材质,具有明显的边缘效果和扁平的明暗转换用于制作卡通风格的场景
StandardMaterial性能表现较好,且支持 PBR(基于物理的渲染),拥有漫反射色、金属度、粗糙度、法向贴图等属性用于需要精细的纹理效果,同时不影响性能的场景
PhysicalMaterial拥有漫反射色、金属度、粗糙度、法向贴图等属性,同时支持自发光和透射用于需要模拟现实光线穿透或散射效果的场景
MeshNormalMaterial将物体的法向量映射到 RGB 色值,用于调试和表示物体表面的法线方向用于检查模型是否有问题,不适用于最终渲染的场景

材质独有属性

材质类型特殊属性默认值
BasicMaterial
LambertMaterialemissive: 光亮度颜色0x000000
PhongMaterialspecular: 高光颜色, shininess: 高光大小specular: 0x111111, shininess: 30
ToonMaterialgradientMap: 用于计算材质颜色的纹理,或直接设置colorRamp: 颜色渐变对象GradientMap: Three.js 默认提供的纹理
StandardMaterialroughness: 粗糙度, metalness: 金属度, envMap: 环境贴图纹理roughness: 0.5, metalness: 0.5, envMap: null
PhysicalMaterialroughness: 粗糙度, metalness: 金属度, envMap: 环境贴图纹理, clearCoat: 透明度, clearCoatRoughness: 透明度的粗糙度roughness: 0.5, metalness: 0.5, envMap: null, clearCoat: 0.0, clearCoatRoughness: 0.0
MeshNormalMaterial

材质常见共有属性

属性默认值属性值类型作用
color0xffffffColor材质颜色
mapnullTexture用于添加纹理贴图
alphaMapnullTexture材质透明贴图
transparentfalseBoolean是否开启透明
opacity1Number透明度(0~1)
visibletrueBoolean是否可见
sideTHREE.FrontSideEnum(THREE.FrontSide, THREE.BackSide, THREE.DoubleSide)材质显示的面
wireframefalseBoolean是否渲染为线框
wireframeLinewidth1Number线框宽度
depthTesttrueBoolean是否开启深度测试
depthWritetrueBoolean是否开启深度写入
blendingTHREE.NormalBlendingEnum(THREE.NormalBlending, THREE.AdditiveBlending, THREE.SubtractiveBlending, THREE.MultiplyBlending, THREE.CustomBlending)混合模式
blendSrcTHREE.SrcAlphaFactorEnum混合模式源算子
blendDstTHREE.OneMinusSrcAlphaFactorEnum混合模式目标算子
blendEquationTHREE.AddEquationEnum混合模式方程式

基础网格材质(MeshBasicMaterial)

一个以简单着色(平面或线框)方式来绘制几何体的材质。

深度网格材质(MeshDepthMaterial)

一种按深度绘制几何体的材质。深度基于相机远近平面。白色最近,黑色最远。

Lambert网格材质(MeshLambertMaterial)

一种非光泽表面的材质,没有镜面高光。

法线网格材质(MeshNormalMaterial)

一种把法向量映射到RGB颜色的材质。

Phong网格材质(MeshPhongMaterial)

一种用于具有镜面高光的光泽表面的材质。

标准网格材质(MeshStandardMaterial)

一种基于物理的标准材质

物理网格材质(MeshPhysicalMaterial)

MeshStandardMaterial的扩展,提供了更高级的基于物理的渲染属性:

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.13.0