Three.js 实战:使用 PBR 贴图打造真实地面材质

在 Three.js 中,我们可以通过 MeshStandardMaterial 材质配合多张贴图来实现真实的地面效果。这种方式模拟了物理世界中光照与表面材质的复杂交互,常用于构建高质量场景,如数字孪生、建筑可视化、游戏等。

本文将以一个完整示例为基础,详细讲解每一类贴图的作用、用法和注意事项。

什么是 PBR 材质贴图?

PBR(Physically Based Rendering)物理渲染模型支持多种纹理贴图,每种贴图都在模拟真实世界中的一个属性:

贴图类型 Three.js 属性名 作用说明
颜色贴图 map 表面基础颜色(必备)
环境遮蔽贴图 aoMap 模拟局部阴影区域(如缝隙)
粗糙度贴图 roughnessMap 控制表面的粗糙程度(影响高光模糊)
法线贴图 normalMap 模拟表面细节凹凸而不改变几何形状
位移贴图 displacementMap 根据灰度值真实改变网格的顶点高度

加载五种贴图创建地面

javascript 复制代码
// 灯光设置
const ambientLight = new THREE.AmbientLight(0xffffff, 0.3); // 环境光
const directionLight = new THREE.DirectionalLight(0xffffff, 0.5); // 平行光
directionLight.position.set(3, 3, 3);
scene.add(ambientLight, directionLight);

// 纹理加载器
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load('infinity-10537028.jpg'); // 示例用一张图

// 创建地面
const planeGeometry = new THREE.PlaneGeometry(10, 10, 100, 100); // 位移贴图需要较多顶点
const planeMaterial = new THREE.MeshStandardMaterial({
  map: texture,              // 基础颜色贴图
  aoMap: texture,            // 环境遮蔽贴图
  roughnessMap: texture,     // 粗糙度贴图
  normalMap: texture,        // 法线贴图
  displacementMap: texture,  // 位移贴图
  displacementScale: 0.5     // 位移高度控制
});

const plane = new THREE.Mesh(planeGeometry, planeMaterial);

// 贴图生效关键步骤:设置第二套 UV 给 aoMap 使用
plane.geometry.setAttribute('uv2', new THREE.BufferAttribute(plane.geometry.attributes.uv.array, 2));

// 地面旋转使其水平
plane.rotation.x = -Math.PI / 2;
scene.add(plane);

📌 注意事项

1. aoMap 环境遮蔽贴图需要第二套 UV

Three.js 默认只创建一套 UV 坐标(uv),而 aoMap 使用的是 uv2。必须手动复制一份:

javascript 复制代码
plane.geometry.setAttribute('uv2', new THREE.BufferAttribute(plane.geometry.attributes.uv.array, 2));

2. displacementMap 位移贴图要求几何体有更多细分(segments)

否则视觉上无效果,因为顶点太少无法形变:

复制代码
javascript 复制代码
new THREE.PlaneGeometry(10, 10, 100, 100); // 加细分

3. 所有贴图建议使用专属图(颜色、法线、AO、粗糙、位移各自一张),格式推荐 .jpg.png,尺寸为 2 的幂次(如 512、1024)以便兼容性更好。

可免费获取完整 PBR 贴图集的网站包括:

搜索关键词如 asphalt, tile, metal, wood 即可获取对应材质的五张贴图。

属性 控制什么
map 颜色
roughnessMap 粗糙程度(影响高光)
normalMap 表面细节(比如划痕)
metalnessMap 是否是金属表面
aoMap 缝隙暗影(更立体)
displacementMap 真实变形(起伏)
相关推荐
向宇it9 小时前
【unity游戏开发入门到精通——3D篇】3D光源之——unity使用Lens Flare (SRP) 组件实现太阳耀斑镜头光晕效果
游戏·3d·unity·游戏引擎·材质
向宇it1 天前
【实现100个unity特效】unity中使用ShaderGraph实现一个贴图UV循环移动滚动的指示效果
游戏·3d·unity·c#·游戏引擎·贴图·uv
小卡不对头1 天前
电脑截图软件排行榜 Windows和mac电脑截图软件TOP10
windows·macos·电脑·笔记本电脑·贴图
向宇it1 天前
【unity组件介绍】URP Decal Projector贴花投影器,将特定材质(贴花)投影到场景中的其他对象上。
游戏·3d·unity·c#·游戏引擎·材质
top_designer2 天前
3D材质总监的“光影魔法”:用Substance Sampler AI,“擦除”照片中的光影
人工智能·3d·新媒体运营·aigc·游戏程序·材质·材质设计师
山海鲸可视化2 天前
模型材质一键替换~轻松还原多种三维场景
webgl·数字孪生·材质·3d模型·三维渲染
☆平常心☆3 天前
UE5 相机后处理材质与动态参数修改
c++·ue5·材质
向宇it10 天前
【unity小技巧】在 Unity 中将 2D 精灵添加到 3D 游戏中,并实现阴影投射效果,实现类《八分旅人》《饥荒》等等的2.5D游戏效果
游戏·3d·unity·编辑器·游戏引擎·材质
向宇it10 天前
Unity Universal Render Pipeline/Lit光照材质介绍
游戏·unity·c#·游戏引擎·材质