侧边栏壁纸
博主头像
MicroMatrix 博主等级

明月别枝惊鹊,清风半夜鸣蝉

  • 累计撰写 135 篇文章
  • 累计创建 41 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

Three.js 材质教学笔记 (Materials)

David
2026-05-13 / 0 评论 / 0 点赞 / 7 阅读 / 0 字

实验环境准备

在深入材质前,视频中首先建立了三个物体来测试效果:

// 创建球体、平面、圆环
const sphere = new THREE.Mesh(new THREE.SphereGeometry(0.5, 64, 64), material)
const plane = new THREE.Mesh(new THREE.PlaneGeometry(1, 1, 100, 100), material)
const torus = new THREE.Mesh(new THREE.TorusGeometry(0.3, 0.2, 64, 128), material)

sphere.position.x = - 1.5
torus.position.x = 1.5
scene.add(sphere, plane, torus)

材质详解:从基础到物理渲染

1. MeshBasicMaterial (基础材质)

最基础的材质,不计算光照。

  • map: 设置颜色贴图。
  • color: 在 JavaScript 中修改颜色需使用 new THREE.Color('red')
  • wireframe: 显示框架。
  • transparent & opacity: 必须先将 transparent 设为 true,透明度才生效。
  • alphaMap: 使用灰度图控制透明区域(黑色透明,白色不透明)。
  • side: THREE.FrontSide (默认), THREE.BackSide, 或 THREE.DoubleSide (渲染内外两面,但更耗性能)。

2. MeshNormalMaterial (法线材质)

显示法线向量(Normal vectors)的颜色。

  • 用途: 调试几何体的法线是否正确。
  • flatShading: 设为 true 后,表面不再平滑,会显示出三角形面片感(Low-poly 风格)。

3. MeshMatcapMaterial (材质捕获)

通过一张球形贴图来“欺骗”眼睛,模拟复杂的光照、阴影和反射。

  • 核心优势: 性能极高,因为它不计算光照,只是将贴图映射到法线上。
  • 代码: material.matcap = matcapTexture

4. MeshDepthMaterial (深度材质)

根据物体距离摄像机的远近来着色(近白远黑)。通常用于阴影映射的内部计算。


需光照材质 (Lights Required)

以下材质若场景中没有灯光(如 AmbientLightPointLight),物体将呈现纯黑色。

5. MeshLambertMaterial & MeshPhongMaterial

  • Lambert: 性能好,适合非镜面物体(如木头),但在强光下会有锯齿。
  • Phong: 性能稍低但支持高光反射。
    • shininess: 控制高光亮度。
    • specular: 控制高光颜色(例如给木头加一个偏蓝的高光)。

6. MeshToonMaterial (卡通/着色器材质)

  • 关键属性: gradientMap。默认只有两级阶梯,通过加载一张极小的 3 像素或 5 像素渐变图来实现多级阶梯。
  • 注意: 必须设置 gradientTexture.magFilter = THREE.NearestFilter 否则渐变会变模糊,失去卡通感。

7. MeshStandardMaterial (标准 PBR 材质) —— 重点

这是视频中花费时间最多的部分,它基于物理渲染(Physically Based Rendering)。

属性 功能说明
metalness 金属感 (0-1)。建议配合调试 UI。
roughness 粗糙度 (0-1)。
map 颜色贴图。
aoMap 环境遮挡贴图。需设置 uv2坐标:geometry.setAttribute('uv2', ...)
displacementMap 置换贴图。物理移动顶点,产生真实的凹凸起伏。需增加几何体细分分段。
normalMap 法线贴图。不改变形状但增加极细微的表面细节。
roughnessMap 局部粗糙度控制(如门把手亮,门面暗)。
// 标准材质完整示例
const material = new THREE.MeshStandardMaterial()
material.map = doorColorTexture
material.aoMap = doorAmbientOcclusionTexture
material.aoMapIntensity = 1
material.displacementMap = doorHeightTexture
material.displacementScale = 0.05
material.metalnessMap = doorMetalnessTexture
material.roughnessMap = doorRoughnessTexture
material.normalMap = doorNormalTexture
material.alphaMap = doorAlphaTexture
material.transparent = true

环境贴图 (Environment Maps)

视频最后展示了如何通过环境贴图让物体反射周围的世界。

  1. 加载器: const cubeTextureLoader = new THREE.CubeTextureLoader()
  2. 资源: 需要 6 张图(px, nx, py, ny, pz, nz)。
  3. 应用: scene.environment = environmentMapTexture
    • 这将自动为场景中所有的 MeshStandardMaterial 提供反射背景。

Bruno Simon 的调试建议

  • 使用 lil-gui: 始终为 metalnessroughness 添加调试条,因为不同的环境光下这些数值的表现差异巨大。
  • 纹理类型: 注意 color 属性会抵消 map 贴图的颜色。
0

评论区