1、PBR材质

PBR是基于物理的渲染(physically-based rendering)。模拟物体表面的反射算法。

Three.js提供了两个PBR材质相关的类MeshStandardMaterialMeshPhysicalMaterial

MeshPhysicalMaterialMeshStandardMaterial扩展的子类,提供了更多功能属性。

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的更多相关文章

  1. 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空 ...

  2. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  3. Node.js教程系列~目录

    Node.js这个东西在近几年火起来了,而且会一直火下去,无论在infoq还是在cnblogs,csdn上,都可以到处看到它的样子,它主推的应该就是异步式I/O 吧,是的,设计的很完美,很吸引人,虽然 ...

  4. 阅读:重新介绍 JavaScript(JS教程)

    这篇文章是记录自己阅读重新介绍 JavaScript(JS 教程)的记录和个人体会 在线调试代码工具:https://codepen.io/pen 引言 分歧根源:名字Javascript和Java有 ...

  5. [整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题

    花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是遇到了些问题,特整理在此. <1>.由于node.msi安装包已经自动添加了 ...

  6. [转载]Node入门 » 一本全面的Node.js教程

    http://www.nodebeginner.org/index-zh-cn.html 作者: Manuel Kiessling 翻译: goddyzhao & GrayZhang & ...

  7. 【转载】Node.js 教程(菜鸟教程系列)

    很好的一篇教程:Node.js 教程 简单做下笔记 概述 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立 ...

  8. 10+ 最佳的 Node.js 教程和实例

    如果你正在找Node.js的学习资料及指南,那么请继续(阅读),我们的教程将会覆盖即时聊天应用.API服务编写.投票问卷应用.人物投票APP.社交授权. Node.js on Raspberry Pi ...

  9. 【js】【读书笔记】廖雪峰的js教程读书笔记

    最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...

  10. SpringBoot系列教程web篇之Beetl环境搭建

    前面两篇分别介绍了目前流行的模板引擎Freemaker和Thymeleaf构建web应用的方式,接下来我们看一下号称性能最好的国产模板引擎Beetl,如何搭建web环境 本文主要来自官方文档,如有疑问 ...

随机推荐

  1. .NET Emit 入门教程:第六部分:IL 指令:4:详解 ILGenerator 指令方法:参数存储指令

    前言: 上一篇介绍了 IL 指令的分类以及参数加载指令,该加载指令以ld开头,将参数加载到栈中,以便于后续执行操作命令. 本篇开始介绍参数存储指令,其指令以st开头,将栈中的数据,存储到指定的变量中, ...

  2. #轮廓线dp,模型转换#洛谷 3226 [HNOI2012]集合选数

    题目 问有多少个集合 \(S\) 是 \([1,n]\) 的子集, 并且 \(\forall a,b\in S,a|b\),满足 \(\frac{b}{a}\neq \{2,3\}\) 分析 可以发现 ...

  3. 「Cnoi2020」Cirno's Easy Round

    目录 前言 A 光图 分析 代码 B 向量 分析 C 高维 分析 D 四角链 分析 代码 E 领域极限 分析 代码 F 明天后的幻想乡 题目 前言 200分果断自闭,F是原题,所以就用原题算了 A,B ...

  4. 上海站报名启动! 2023年开源产业生态大会OpenHarmony生态分论坛

      作为年内开源领域不容错过的科技盛宴,2023年开源产业生态大会将于12月19日在上海盛大开幕.本次活动由上海市经济和信息化委员会.上海市科学技术协会和"科创中国"开源创新联合体 ...

  5. openGauss Cluster Manager RTO Test

    一.环境介绍 软件环境 类别 版本 下载链接 备注 OS openEuler 20.03 (LTS) https://repo.openeuler.org/openEuler-20.03-LTS/IS ...

  6. JMeter接口性能测试工具

    博客地址:https://blog.csdn.net/lovesoo/article/details/78579547

  7. 【直播预告】HarmonyOS极客松赋能直播第二期:数据库与网络连接开发

  8. linux下升级openssh参考[不建议采用此法安装]

    本人不见一采用这种方法安装,只是当遇到问题时候有一定的参考意义,所以贴了上来.建议使用yum方式安装,详见在下另一篇博文: http://blog.csdn.net/lqzixi/article/de ...

  9. redis 简单整理——bitmaps[十二]

    前言 简单介绍一下bitmaps这个东西. 正文 我们都知道bitmaps 翻译过来就是二进制. 那么二进制可以存一些什么呢? 图片.视频,还可也存些什么呢? 现代计算机用二进制(位)作为信息的基础单 ...

  10. WPF基础:在Canvas上绘制图形

    Canvas介绍 Canvas是WPF(Windows Presentation Foundation)中的一种面板控件,用于在XAML中布置子元素.它提供了绝对定位的能力,允许元素在自由的二维空间中 ...