three.js教程7-PBR材质与环境贴图CubeTextureLoader
1、PBR材质
PBR是基于物理的渲染(physically-based rendering)。模拟物体表面的反射算法。
Three.js提供了两个PBR材质相关的类MeshStandardMaterial和MeshPhysicalMaterial
MeshPhysicalMaterial是MeshStandardMaterial扩展的子类,提供了更多功能属性。

PBR材质相比MeshLambertMaterial和MeshPhongMaterial可以提供更逼真的、更接近生活中的材质效果,当然也会占用更多的电脑硬件资源。
PBR相关理论介绍文章
半小时了解PBR:https://zhuanlan.zhihu.com/p/37639418
PBR知识体系整理:https://zhuanlan.zhihu.com/p/100596453
PBR核心知识体系总结与概览:https://zhuanlan.zhihu.com/p/53086060
2、MeshStandardMaterial材质实现金属效果
(1) 金属度metalness、粗糙度roughness
//金属度
//默认是0.5,范围是0到1之间。木材或石材用0,金属使用1。
mesh.material.metalness = 1.0;
//表面粗糙度
//默认0.5,范围是0~1之间,0表示平滑的镜面反射,1表示完全漫反射,
mesh.material.roughness = 0.5;
(2)环境贴图.envMap=CubeTextureLoader()立方体纹理加载器加载环境贴图
环境贴图,是一个模型周围的环境的图像,比如:室内模型的环境贴图是:房子四周墙壁环境,房子的上下左右前后分别拍摄一张照片,就是3D空间中6个角度方向的照片。
// 加载环境贴图
// 加载周围环境6个方向贴图
// 上下左右前后6张贴图构成一个立方体空间
// 'px.jpg', 'nx.jpg':x轴正方向、负方向贴图 p:正positive n:负negative
// 'py.jpg', 'ny.jpg':y轴贴图
// 'pz.jpg', 'nz.jpg':z轴贴图
const textureCube = new THREE.CubeTextureLoader()
.setPath('./环境贴图/环境贴图0/')
.load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
// CubeTexture表示立方体纹理对象,父类是纹理对象Texture
new THREE.MeshStandardMaterial({
metalness: 1.0,
roughness: 0.5,
envMap: textureCube, //设置pbr材质环境贴图
})
(3)环境贴图强度envMapIntensity-环境贴图反射率
// envMapIntensity:控制环境贴图对mesh表面影响程度
//默认值1, 设置为0相当于没有环境贴图
obj.material.envMapIntensity = 1.0;
(4)场景环境属性.environment
加载gltf模型后,如果你希望环境贴图影响场景中scene所有Mesh,1、可以循环遍历模型设置envMap,2、也可以通过Scene的场景环境属性.environment实现。
//方法1
loader.load("../工厂.glb", function (gltf) {
// 递归遍历批量设置环境贴图
gltf.scene.traverse(function (obj) {
if (obj.isMesh) { //判断是否是网格模型
obj.material.envMap = textureCube; //设置环境贴图
}
});
})
//方法2:
// 环境贴图纹理对象textureCube作为.environment属性值,影响所有模型
scene.environment = textureCube; //如果renderer.outputEncoding=THREE.sRGBEncoding;环境贴图需要保持一致
textureCube.encoding = THREE.sRGBEncoding;
3、MeshPhysicalMaterial材质-新增属性
(1)清漆层clearcoat和清漆层粗糙度.clearcoatRoughness
clearcoat:模拟物体表面一层透明图层,类似车漆的抛光打蜡,具有透明和反光特性,值越大反光效果越好。clearcoatRoughness,值越大反光效果越弱。
const material = new THREE.MeshPhysicalMaterial( {
clearcoat: 1.0,//半透明涂层的厚度,默认是0,范围是0~1m
clearcoatRoughness: 0.1,//半透明涂层表面的粗糙度,默认是0,范围是0~1
} );
(2) 玻璃的透光率(透射度).transmission
物理光学透明度.transmission的值范围是从0.0到1.0。默认值为0.0。
const mesh = gltf.scene.getObjectByName('玻璃01')
mesh.material = new THREE.MeshPhysicalMaterial({
transmission: 1.0, //玻璃材质透光率,transmission替代opacity
})
(3) 折射率ior
非金属材料的折射率从1.0到2.333。默认值为1.5。
不同材质的折射率,你可以百度搜索。
new THREE.MeshPhysicalMaterial({
ior:1.5,//折射率
})
(4)反射率.reflectivity、光泽.sheen
4、三维软件导出PBR材质属性
实际开发的时候PBR材质的属性,很多时候是可以在三维建模软件中设置的,然后通过gltf导出即可,这样就不用在threejs代码设置。
通常美术对三维场景渲染的了解也比大部分前端程序员多的多,只要美术在三维建模软件设置好并导出包含pbr材质属性的gltf即可。
(1)threejs解析gltf材质规则
threejs解析gltf模型材质的时候,一般默认使用标准网格材质MeshStandardMaterial,如果gltf有的材质具有.clearcoat、.transmission等属性,标准网格材质MeshStandardMaterial无法表达的时候,会用物理网格材质MeshPhysicalMaterial来解析gltf材质。
(2)设置环境贴图
这时候清漆、清漆粗糙度、透光率(透射度)等属性Bledner都已经设置好了,threejs可以自动解析渲染,不用在代码中麻烦设置了,只要配上环境贴图即可。
// 加载环境贴图
const textureCube = new THREE.CubeTextureLoader()
.setPath('../../环境贴图/环境贴图1/')
.load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
textureCube.encoding = THREE.sRGBEncoding; //设置纹理贴图编码方式和WebGL渲染器一致
// 加载gltf模型,然后给指定模型设置环境贴图
loader.load("../../轿车.glb", function (gltf) {
model.add(gltf.scene);
const mesh = gltf.scene.getObjectByName('玻璃01');
mesh.material.envMap=textureCube;
mesh.material.envMapIntensity=1.0;
})
示例1:金属效果


const model = new THREE.Group(); //声明一个组对象,用来添加加载成功的三维场景
// 加载环境贴图
// 加载周围环境6个方向贴图
// 上下左右前后6张贴图构成一个立方体空间
// 'px.jpg', 'nx.jpg':x轴正方向、负方向贴图 p:正positive n:负negative
// 'py.jpg', 'ny.jpg':y轴贴图
// 'pz.jpg', 'nz.jpg':z轴贴图
// CubeTexture表示立方体纹理对象,父类是纹理对象Texture
const textureCube = new THREE.CubeTextureLoader()
.setPath('../../环境贴图/环境贴图1/')
.load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']); const loader = new GLTFLoader(); //创建一个GLTF加载器
loader.load("../../金属.glb", function (gltf) {
// 递归遍历所有模型节点批量修改材质
gltf.scene.traverse(function (obj) {
if (obj.isMesh) { //判断是否是网格模型
// console.log('obj.material',obj.material);
// 重新设置材质的金属度和粗糙度属性
obj.material.metalness = 1.0; //金属度
obj.material.roughness = 0.3; //表面粗糙度
obj.material.envMap = textureCube; //设置环境贴图
// envMapIntensity:控制环境贴图对mesh表面影响程度
obj.material.envMapIntensity = 1.0;//默认值1, 设置为0.0相当于没有环境贴图
}
});
model.add(gltf.scene);
})
示例2:车外壳油漆反光效果-清漆层属性clearcoat

const model = new THREE.Group(); //声明一个组对象,用来添加加载成功的三维场景
// 加载环境贴图
const textureCube = new THREE.CubeTextureLoader()
.setPath('../../环境贴图/环境贴图1/')
.load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']); textureCube.encoding = THREE.sRGBEncoding; //设置纹理贴图编码方式和WebGL渲染器一致 const loader = new GLTFLoader(); //创建一个GLTF加载器
loader.load("../../轿车.glb", function (gltf) {
model.add(gltf.scene);
// 车外壳包含多个Mesh,获取其中一个
const mesh = gltf.scene.getObjectByName('外壳01');
mesh.material = new THREE.MeshPhysicalMaterial({
color: mesh.material.color, //默认颜色
metalness: 0.9,//车外壳金属度
roughness: 0.5,//车外壳粗糙度
clearcoat: 1, //清漆层
clearcoatRoughness: 0.01, //清漆层粗糙度
envMap: textureCube, //环境贴图
envMapIntensity: 2.5, //环境贴图对Mesh表面影响程度
})
})
示例3:车玻璃效果-透光率transmission和折射率ior

const model = new THREE.Group(); //声明一个组对象,用来添加加载成功的三维场景
// 加载环境贴图
const textureCube = new THREE.CubeTextureLoader()
.setPath('../../环境贴图/环境贴图1/')
.load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
textureCube.encoding = THREE.sRGBEncoding; //设置纹理贴图编码方式和WebGL渲染器一致 // 加载gltf模型
const loader = new GLTFLoader(); //创建一个GLTF加载器
loader.load("../../轿车.glb", function (gltf) {
model.add(gltf.scene);
const mesh = gltf.scene.getObjectByName('玻璃01')
mesh.material = new THREE.MeshPhysicalMaterial({
metalness: 0.0,//玻璃非金属
roughness: 0.0,//玻璃表面光滑
envMap:textureCube,//环境贴图
envMapIntensity: 1.0, //环境贴图对Mesh表面影响程度
transmission: 1.0, //玻璃材质透光率,transmission替代opacity
ior:1.5,//折射率
})
})

文章中部分素材选取自Threejs中文网:http://www.webgl3d.cn/
three.js教程7-PBR材质与环境贴图CubeTextureLoader的更多相关文章
- UE制作PBR材质攻略Part 1 - 色彩知识
目录 一.前言 二.色彩知识 2.1 色彩理论 2.1.1 成像原理 2.1.2 色彩模型和色彩空间 2.1.3 色彩属性 2.1.4 直方图 2.1.5 色调曲线 2.1.6 线性空间与Gamma空 ...
- Node.js 教程 01 - 简介、安装及配置
系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...
- Node.js教程系列~目录
Node.js这个东西在近几年火起来了,而且会一直火下去,无论在infoq还是在cnblogs,csdn上,都可以到处看到它的样子,它主推的应该就是异步式I/O 吧,是的,设计的很完美,很吸引人,虽然 ...
- 阅读:重新介绍 JavaScript(JS教程)
这篇文章是记录自己阅读重新介绍 JavaScript(JS 教程)的记录和个人体会 在线调试代码工具:https://codepen.io/pen 引言 分歧根源:名字Javascript和Java有 ...
- [整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题
花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是遇到了些问题,特整理在此. <1>.由于node.msi安装包已经自动添加了 ...
- [转载]Node入门 » 一本全面的Node.js教程
http://www.nodebeginner.org/index-zh-cn.html 作者: Manuel Kiessling 翻译: goddyzhao & GrayZhang & ...
- 【转载】Node.js 教程(菜鸟教程系列)
很好的一篇教程:Node.js 教程 简单做下笔记 概述 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立 ...
- 10+ 最佳的 Node.js 教程和实例
如果你正在找Node.js的学习资料及指南,那么请继续(阅读),我们的教程将会覆盖即时聊天应用.API服务编写.投票问卷应用.人物投票APP.社交授权. Node.js on Raspberry Pi ...
- 【js】【读书笔记】廖雪峰的js教程读书笔记
最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...
- SpringBoot系列教程web篇之Beetl环境搭建
前面两篇分别介绍了目前流行的模板引擎Freemaker和Thymeleaf构建web应用的方式,接下来我们看一下号称性能最好的国产模板引擎Beetl,如何搭建web环境 本文主要来自官方文档,如有疑问 ...
随机推荐
- HTTP编码和解码与基本认证
咱们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流.那么在这二者之间的转换规则就须要一个统一的标准,不然把计算机上文档就乱码了:因而为了实现转换标准,各类字符集标准 ...
- #2-sat,Tarjan#洛谷 4171 [JSOI2010]满汉全席
题目 分析 考虑两个至少选一个就是非A即B,非B即A, 都可行当且仅当A与非A不在同一个强连通分量里 代码 #include <cstdio> #include <cctype> ...
- #Tarjan#洛谷 1407 [国家集训队]稳定婚姻
题目 分析 如果婚姻安全那么两个点不在同一个强连通分量, 考虑强制定方向,夫妻女向男连边,情侣男向女连边, 这样就直接用Tarjan有向图缩点就可以了 代码 #include <iostream ...
- 2024-04-06:用go语言,给你两个非负整数数组 rowSum 和 colSum, 其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和,换言之你
2024-04-06:用go语言,给你两个非负整数数组 rowSum 和 colSum, 其中 rowSum[i] 是二维矩阵中第 i 行元素的和, colSum[j] 是第 j 列元素的和,换言之你 ...
- 未来已来,OpenHarmony 3.2 Release发布,迈入发展新阶段
2023年4月9日,在社区开发者的期盼中,在春风送暖万物更新的季节里,我们迎来了OpenAtom OpenHarmony(以下简称"OpenHarmony")3.2 Relea ...
- hive窗口分析函数使用详解系列一
1.综述 Hive的聚合函数衍生的窗口函数在我们进行数据处理和数据分析过程中起到了很大的作用 在Hive中,窗口函数允许你在结果集的行上进行计算,这些计算不会影响你查询的结果集的行数. Hive提供的 ...
- 【FAQ】接入HMS Core广告服务中的常见问题总结和解决方法
HMS Core广告服务(Ads Kit)为开发者提供流量变现服务和广告标识服务,依托华为终端能力,整合资源,帮助开发者获取高质量的广告内容.同时提供转化跟踪参数服务,支持三方监测平台.广告主进行转化 ...
- vue3 快速入门系列 —— vue3 路由
vue3 快速入门系列 - vue3 路由 在vue3 基础上加入路由. vue3 需要使用 vue-router V4,相对于 v3,大部分的 Vue Router API 都没有变化. Tip:不 ...
- HarmonyOS崩溃服务能力全新上线,帮你高效解决崩溃问题!
原文:https://mp.weixin.qq.com/s/YmYzNXsvsqt8U8JX3vlmrg,点击链接查看更多技术内容. 一.为什么需要崩溃服务能力 用户在使用原子化服务时,出现卡顿.缓慢 ...
- HarmonyOS开发者创新大赛总决赛结果公布
原文:https://mp.weixin.qq.com/s/I-AofLNY72_CtnHWg2k-Bw,点击链接查看更多技术内容. 2021 年 10 月 22 日第二届 HarmonyOS 开发者 ...