mcpField
T
threejs-syntax-materials

threejs-syntax-materials

github.com/impertio-studio开发23137 次安装30 周前更新
代码仓库

关于 threejs-syntax-materials

面向 Three.js 开发者的材质与纹理参考技能,涵盖材质选择、配置及常见问题。内容包括颜色空间规则、生命周期方法和渲染注意事项。

主要功能

  1. 01按渲染用途选择材质
  2. 02常用材质属性与方法
  3. 03PBR 与高级材质说明
  4. 04纹理颜色空间与环绕规则
  5. 05着色器更新和 GPU 清理建议

适用场景

  1. 01为场景对象选择材质
  2. 02正确设置纹理颜色空间
  3. 03移除对象时避免 GPU 泄漏

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/impertio-studio/three.js-claude-skill-package --skill threejs-syntax-materials

安装后在 Claude Code 中输入/threejs-syntax-materials确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.gitkeep
references/
anti-patterns.md
examples.md
methods.md

详细介绍

threejs-syntax-materials

快速参考

材质类型决策树
使用场景材质原因
UI 元素、无光照场景MeshBasicMaterial开销最低,无需计算光照
哑光漫反射(低端设备)MeshLambertMaterial漫反射计算快速,无高光
传统镜面高光MeshPhongMaterialBlinn-Phong 模型,不符合物理规律
通用 3D(推荐)MeshStandardMaterial基于 PBR 的金属度/粗糙度模型,行业标准
玻璃、汽车漆、织物、肥皂泡MeshPhysicalMaterial高级 PBR(清漆层、透射、光泽、虹彩)
卡通/动漫风格MeshToonMaterial离散的卡通着色阶
雕刻预览、无光照MeshMatcapMaterialMatcap 纹理,无需设置光照
调试法线MeshNormalMaterialRGB = 表面法线方向
隐形阴影接收面ShadowMaterial透明阴影接收材质
实线LineBasicMaterial简单的彩色线条
虚线LineDashedMaterial需要调用 line.computeLineDistances()
粒子PointsMaterial点云渲染
广告牌SpriteMaterial四边形始终朝向摄像机
基础材质属性(所有材质)
属性类型默认值说明
sidenumberFrontSideFrontSide、BackSide 或 DoubleSide
transparentbooleanfalse启用 Alpha 混合
opacitynumber1低于 1 时,必须设置 transparent: true 才会生效
depthWritebooleantrue写入深度缓冲区
depthTestbooleantrue与深度缓冲区进行测试
blendingnumberNormalBlendingNoBlending、AdditiveBlending、SubtractiveBlending、MultiplyBlending、CustomBlending
alphaTestnumber0丢弃 Alpha 值低于此值的片段
visiblebooleantrue是否渲染此材质
wireframebooleanfalse线框渲染模式
fogbooleantrue受场景雾效影响
clippingPlanesPlane[]null裁剪平面数组
clipIntersectionbooleanfalse在所有平面的交集处裁剪(而非并集)
needsUpdatebooleanfalse设置为 true 以触发着色器重新编译
toneMappedbooleantrue应用渲染器色调映射
基础材质方法
方法签名说明
clone(): Material克隆材质
copy(source: Material): Material从源对象复制属性
dispose(): void释放 GPU 资源——移除时务必调用
onBeforeCompile(shader, renderer): void在编译前修改着色器的钩子
setValues(values: Object): void一次设置多个属性
重要警告

绝不要在未设置 transparent: true 的情况下设置 opacity < 1——不透明度值会被静默忽略。务必同时设置两者。

绝不要在 MeshStandardMaterial 已足够时使用 MeshPhysicalMaterial——Physical 会编译出明显更大的着色器。只有在需要清漆、透射、光泽、虹彩或各向异性时才使用它。

绝不要在法线贴图、粗糙度贴图、金属度贴图或任何数据纹理上设置 SRGBColorSpace——这会破坏数据并导致光照不正确。只有在漫反射/颜色/自发光纹理上设置 SRGBColorSpace。

绝不要在移除对象时忘记调用 material.dispose() 和 texture.dispose()——GPU 内存泄漏会不断累积,最终导致应用崩溃。

绝不要在 LineBasicMaterial 上设置 linewidth > 1——由于 WebGL 的限制,大多数平台会静默忽略此设置。对于粗线,务必使用 three/addons/lines/ 中的 Line2 + LineMaterial。

务必在更改会影响着色器编译的属性后设置 material.needsUpdate = true(例如,切换 flatShading、更改 side、在运行时添加/移除纹理贴图)。

务必在使用非 (1, 1) 的 texture.repeat 值时,将 wrapS 和 wrapT 设置为 RepeatWrapping——默认的 ClampToEdgeWrapping 不会平铺纹理。


MeshStandardMaterial(PBR)

适用于大多数 3D 场景的推荐材质。采用基于物理的金属度/粗糙度工作流。

import { MeshStandardMaterial, TextureLoader, SRGBColorSpace, RepeatWrapping } from 'three';

const loader = new TextureLoader();
const material = new MeshStandardMaterial({
  color: 0xffffff,
  roughness: 0.7,           // 0 = mirror, 1 = fully rough
  metalness: 0.0,           // 0 = dielectric, 1 = metal
  map: null,                // Diffuse/albedo texture
  roughnessMap: null,       // Per-pixel roughness
  metalnessMap: null,       // Per-pixel metalness
  normalMap: null,          // Surface normal perturbation
  normalScale: new Vector2(1, 1),
  aoMap: null,              // Ambient occlusion (requires uv2)
  aoMapIntensity: 1.0,
  emissive: 0x000000,       // Emissive color
  emissiveMap: null,        // Emissive texture
  emissiveIntensity: 1.0,
  envMap: null,             // Environment reflection map
  envMapIntensity: 1.0,
  bumpMap: null,            // Grayscale height map
  bumpScale: 1.0,
  displacementMap: null,    // Vertex displacement map
  displacementScale: 1.0,
  displacementBias: 0.0,
  alphaMap: null,           // Per-pixel transparency
  lightMap: null,           // Baked lighting (requires uv2)
  lightMapIntensity: 1.0,
  flatShading: false,
  wireframe: false,
  fog: true
});

MeshPhysicalMaterial(高级 PBR)

在 MeshStandardMaterial 的所有属性基础上扩展了以下属性:

属性类型默认值描述
clearcoatfloat0.0清漆层强度(0-1)
clearcoatRoughnessfloat0.0清漆粗糙度
clearcoatMapTexturenull清漆强度贴图
clearcoatNormalMapTexturenull清漆法线贴图
transmissionfloat0.0基于物理的透明度(0-1)
transmissionMapTexturenull透射贴图
thicknessfloat0.0透射体积厚度
thicknessMapTexturenull厚度贴图
iorfloat1.5折射率(1.0-2.333)
attenuationDistancefloatInfinity光在体积中的衰减距离
attenuationColorColorwhite光衰减色调
sheenfloat0.0光泽层强度(类似织物)
sheenColorColor0x000000光泽色调
sheenRoughnessfloat1.0光泽粗糙度
iridescencefloat0.0薄膜干涉(0-1)
iridescenceIORfloat1.3虹彩折射率
iridescenceThicknessRange[float, float][100, 400]薄膜厚度范围(nm)
anisotropyfloat0.0各向异性反射强度
anisotropyRotationfloat0.0各向异性旋转(弧度)
specularIntensityfloat1.0镜面层强度
specularColorColorwhite镜面色调
dispersionfloat0.0色散(彩虹效果)
reflectivityfloat0.5法线入射时的反射率

纹理系统

颜色空间规则(重要)
地图类型颜色空间使用的通道
map(漫反射/反照率)SRGBColorSpaceRGB(A)
emissiveMapSRGBColorSpaceRGB
lightMapSRGBColorSpaceRGB
envMapSRGBColorSpaceRGB
sheenColorMapSRGBColorSpaceRGB
specularColorMapSRGBColorSpaceRGB
normalMapNoColorSpaceRGB
roughnessMapNoColorSpaceG 通道
metalnessMapNoColorSpaceB 通道
aoMapNoColorSpaceR 通道
bumpMapNoColorSpaceR 通道
displacementMapNoColorSpaceR 通道
alphaMapNoColorSpaceR 通道
clearcoatMapNoColorSpaceR 通道
clearcoatRoughnessMapNoColorSpaceR 通道
clearcoatNormalMapNoColorSpaceRGB
transmissionMapNoColorSpaceR 通道
thicknessMapNoColorSpaceR 通道
iridescenceMapNoColorSpaceR 通道
iridescenceThicknessMapNoColorSpaceR 通道
sheenRoughnessMapNoColorSpaceR 通道
anisotropyMapNoColorSpaceRG 通道
specularIntensityMapNoColorSpaceA 通道

规则:漫反射/自发光/颜色纹理 = SRGBColorSpace。所有数据纹理 = NoColorSpace。设置错误会导致渲染效果褪色或过度饱和。

纹理加载器
加载器格式导入
TextureLoaderPNG、JPG、WebPthree 核心
CubeTextureLoader6 张 PNG/JPG 立方体贴图three 核心
RGBELoader.hdr(Radiance HDR)three/addons/loaders/RGBELoader.js
EXRLoader.exr(OpenEXR HDR)three/addons/loaders/EXRLoader.js
KTX2Loader.ktx2(GPU 压缩)three/addons/loaders/KTX2Loader.js
环绕模式
常量描述
ClampToEdgeWrapping拉伸边缘纹素(默认)
RepeatWrapping平铺/重复纹理
MirroredRepeatWrapping交替镜像平铺
过滤模式
常量类型描述
NearestFilter放大/缩小像素化、清晰(复古风格、卡通渐变)
LinearFilter放大/缩小平滑插值
LinearMipmapLinearFilter缩小三线性过滤(默认,质量最佳)
纹理属性
属性类型默认值描述
wrapS / wrapTnumberClampToEdgeWrapping环绕模式
magFilternumberLinearFilter放大过滤器
minFilternumberLinearMipmapLinearFilter缩小过滤器
anisotropynumber1各向异性过滤(最大值 = renderer.capabilities.getMaxAnisotropy())
repeatVector2(1, 1)UV 重复次数
offsetVector2(0, 0)UV 偏移
rotationnumber0UV 旋转角度(弧度)
centerVector2(0, 0)旋转中心
flipYbooleantrue上传时垂直翻转
colorSpacestringNoColorSpace颜色空间解释方式
generateMipmapsbooleantrue自动生成 mipmap
needsUpdatebooleanfalse触发 GPU 重新上传
flipY 规则
  • flipY = true(默认):适用于已加载的图像纹理(PNG、JPG)
  • flipY = false:对于 WebGLRenderTarget 纹理、DataTexture 和帧缓冲区纹理,始终使用此设置

材质释放

// ALWAYS dispose materials and textures when removing objects
function disposeMesh(mesh) {
  if (mesh.material) {
    // Dispose all texture maps
    for (const key of Object.keys(mesh.material)) {
      const value = mesh.material[key];
      if (value && value.isTexture) {
        value.dispose();
      }
    }
    mesh.material.dispose();
  }
  if (mesh.geometry) {
    mesh.geometry.dispose();
  }
}

needsUpdate 标记

运行时更改以下属性后,始终设置 material.needsUpdate = true:

  • 切换 flatShading
  • 更改 side(FrontSide/BackSide/DoubleSide)
  • 添加或移除纹理贴图(例如,将 map 从 null 设置为纹理)
  • 更改 transparent 或 alphaTest
  • 切换 wireframe
  • 任何会改变已编译着色器变体的属性

切勿每帧都设置 needsUpdate = true——这会触发开销巨大的着色器重新编译。仅在属性更改后设置一次。

对于纹理:修改 texture.image 数据后,设置 texture.needsUpdate = true,以触发 GPU 重新上传。


卡通材质特别规则

使用 MeshToonMaterial 时,始终将 gradientMap.minFilter = NearestFilter 和 gradientMap.magFilter = NearestFilter。线性过滤会将离散的明暗阶梯模糊为平滑渐变,破坏卡通效果。


参考链接

官方来源

评论

支持 Markdown