MeshStandardMaterial
基于物理的金属度—粗糙度材质,是三维场景里表现真实表面的默认选择。
构造参数是一个配置对象,对象里的键会直接赋给同名属性:
new THREE.MeshStandardMaterial({ color: 0x99aabb, roughness: 0.7 })。
未传入的属性取默认值。
常用参数
| 参数 | 默认 | 说明 |
|---|---|---|
color | 0xffffff | 基础色,十六进制或 Color 实例 |
roughness | 1.0 | 粗糙度,0 为镜面,1 为完全漫反射 |
metalness | 0.0 | 金属度,0 为绝缘体,1 为纯金属 |
emissive | 0x000000 | 自发光颜色,不受光照影响 |
emissiveIntensity | 1 | 自发光强度倍数 |
map | null | 颜色贴图,乘到 color 上 |
normalMap | null | 法线贴图,需要几何体带切线或由导数推算 |
roughnessMap | null | 粗糙度贴图,取绿通道 |
metalnessMap | null | 金属度贴图,取蓝通道 |
envMapIntensity | 1 | 环境贴图影响的强弱 |
flatShading | false | 关闭顶点法线插值,呈现块面效果 |
vertexColors | false | 开启后读取几何体的 color 属性 |
wireframe | false | 只画三角面边线 |
side | THREE.FrontSide | 渲染面,可选 BackSide、DoubleSide |
transparent | false | 开启透明混合,需配合 opacity |
opacity | 1.0 | 不透明度,仅在 transparent 为 true 时生效 |
成员
| 成员 | 说明 |
|---|---|
normalScale | Vector2,默认 (1, 1),控制法线贴图的强度 |
aoMapIntensity | 默认 1,环境光遮蔽贴图的影响强度 |
displacementScale | 默认 1,置换贴图的位移倍率 |
displacementBias | 默认 0,置换的基准偏移 |
alphaTest | 默认 0,低于该 alpha 的片元直接丢弃 |
depthWrite | 默认 true,关闭后不写深度,透明物体排序时要小心 |
fog | 默认 true,是否受场景雾影响 |
onBeforeCompile | 回调,可向内置着色器注入代码 |
方法
| 方法 | 说明 |
|---|---|
clone() | 复制一份材质,贴图引用共享 |
copy(source) | 把另一份材质的属性覆盖到自身 |
dispose() | 释放 GPU 侧程序与 uniform,移除物体后仍需显式调用 |
needsUpdate | 属性而非方法:增删贴图槽位或改 vertexColors 后置为 true |
基本用法
const material = new THREE.MeshStandardMaterial({
color: 0x8fa6c0,
roughness: 0.62,
metalness: 0.15,
side: THREE.DoubleSide
});
const mesh = new THREE.Mesh(
new THREE.BoxGeometry(4, 4, 4),
material
);
scene.add(mesh);
改颜色这类标量或颜色属性直接赋值即可生效;
增删贴图(例如把 map 从 null 换成一张纹理)必须写
material.needsUpdate = true,否则着色器不会重编译。
粗糙度与金属度怎么取
这两个参数决定高光的形状与强度。metalness 为 0 时高光颜色来自光源,
为 1 时高光颜色取自材质本身。混凝土、木材、地形这类表面应保持金属度为 0,
粗糙度在 0.7 到 1 之间;金属栏杆、幕墙玻璃则把金属度提到 0.6 以上,粗糙度压到 0.3 以下。
金属度大于 0 的材质几乎只靠环境贴图提供颜色。没有 scene.environment
也没有 envMap 时,金属部分会变成一片暗色,
这是场景「发黑」的最常见原因。
顶点色与批量着色
// 几何体带 color 属性时,材质要显式开启
material.vertexColors = true;
material.needsUpdate = true;
// 关闭光照相关计算,适合纯色示意
const flat = new THREE.MeshBasicMaterial({ vertexColors: true });
顶点色与 color 是相乘关系。想用顶点色表达高程色带时,
应把 material.color 保持白色,否则颜色会被整体压暗。
这是渲染材质,不处理坐标。MeshStandardMaterial
只描述表面如何被光照,不关心数据是经纬度还是米制坐标。
三维场景里的位置、比例与投影都由几何体和相机决定,材质只负责外观。
经纬志(2026)。《MeshStandardMaterial》。https://www.jingweizhi.com/three/api/mesh-standard-material.html(访问日期 2026-11-03)。