threejs金属材质效果 PBR材质金属度和粗糙度

参考资料:threejs中文网

threejs qq交流群:814702116

PBR材质金属度和粗糙度(金属效果)

本节课给大家介绍PBR材质MeshStandardMaterial金属度 metalness粗糙度 roughness,再加上下节课讲解的环境贴图.envMap,给大家呈现一个金属渲染效果

金属度 metalness

金属度 属性.metalness表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。

threejs的PBR材质,.metalness默认是0.5,0.0到1.0之间的值可用于生锈的金属外观

JavaScript 复制代码
new THREE.MeshStandardMaterial({
    metalness: 1.0,//金属度属性
})
JavaScript 复制代码
mesh.material.metalness = 1.0;//金属度

粗糙度 roughness

生活中不同物体表面的粗糙程度不同,比如地面比较粗糙,比如镜子表面就非常非常光滑。

粗糙度 roughness表示模型表面的光滑或者说粗糙程度,越光滑镜面反射能力越强,越粗糙,表面镜面反射能力越弱,更多地表现为漫反射。

粗糙度 roughness,0.0表示平滑的镜面反射,1.0表示完全漫反射,默认0.5。

JavaScript 复制代码
new THREE.MeshStandardMaterial({
    roughness: 0.5,//表面粗糙度
})
JavaScript 复制代码
mesh.material.roughness = 0.5;//表面粗糙度

环境贴图.envMap(金属效果)

环境贴图对PBR材质渲染效果影响还是比较大,一般渲染PBR材质的模型,最好设置一个合适的环境贴图。

立方体纹理加载器CubeTextureLoader

  • TextureLoader返回Texture
  • CubeTextureLoader返回CubeTexture

通过前面学习大家知道,通过纹理贴图加载器TextureLoader.load()方法加载一张图片可以返回一个纹理对象Texture

立方体纹理加载器CubeTextureLoader.load()方法是加载6张图片,返回一个立方体纹理对象CubeTexture

立方体纹理对象CubeTexture的父类是纹理对象Texture

CubeTextureLoader加载环境贴图

所谓环境贴图 ,就是一个模型周围的环境的图像,比如一间房子,房子的上下左右前后分别拍摄一张照片,就是3D空间中6个角度方向的照片。

JavaScript 复制代码
// 加载环境贴图
// 加载周围环境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 

MeshStandardMaterial环境贴图属性.envMap

实际生活中,一个物体表面,往往会反射周围的环境。人的眼睛看到的东西,往往反射有周围景物,所以three.js渲染模型,如果想渲染效果更好看,如果想更符合实际生活情况,也需要想办法让模型反射周围景物。

MeshStandardMaterial材质的环境贴图属性是.envMap,通过PBR材质的贴图属性可以实现模型表面反射周围景物,这样渲染效果更好。

JavaScript 复制代码
// 加载环境贴图
const textureCube = new THREE.CubeTextureLoader()
    .setPath('./环境贴图/环境贴图0/')
    .load(['px.jpg', 'nx.jpg', 'py.jpg', 'ny.jpg', 'pz.jpg', 'nz.jpg']);
new THREE.MeshStandardMaterial({
    metalness: 1.0,
    roughness: 0.5,
    envMap: textureCube, //设置pbr材质环境贴图
})    
JavaScript 复制代码
obj.material.envMap = textureCube; //设置环境贴图 

环境贴图反射率.envMapIntensity

MeshStandardMaterial.envMapIntensity属性主要用来设置模型表面反射周围环境贴图的能力,或者说环境贴图对模型表面的影响能力。具体说.envMapIntensity相当于环境贴图的系数,环境贴图像素值乘以该系数后,在用于影响模型表面。

JavaScript 复制代码
// envMapIntensity:控制环境贴图对mesh表面影响程度
//默认值1, 设置为0.0,相当于没有环境贴图
obj.material.envMapIntensity = 1.0;

粗糙度 roughness为0

你可以尝试把粗糙度 roughness设置为0,看看模型对环境贴图的反射效果。

JavaScript 复制代码
obj.material.roughness = 0.0;//完全镜面反射,像镜子一样

选择合适的环境贴图

不同的明暗或景物的环境贴图对渲染效果的影响是不一样的,所以不仅要设置环境贴图,还要根据需要选择合适的环境贴图,一般实际开发使用美术提供的环境贴图即可。

你可以尝试测试源码中提供多个环境贴图对比渲染效果差异。

纹理和渲染器颜色空间一致

JavaScript 复制代码
//如果renderer.outputEncoding=THREE.sRGBEncoding;环境贴图需要保持一致
textureCube.encoding = THREE.sRGBEncoding;   
相关推荐
优雅永不过时·10 天前
原生Three.js 和 Cesium.js 案例 。 智慧城市 数字孪生常用功能列表
前端·javascript·低代码·编辑器·智慧城市·webgl·three.js
一粒马豆1 个月前
three.js用粒子使用canvas生成的中文字符位图材质
3d·three.js·canvas·中文字符·粒子动画
一粒马豆1 个月前
three.js实现裸眼双目平行立体视觉
3d·vr·three.js·裸眼双目平行立体视觉
咔咔库奇1 个月前
【three.js】纹理贴图
开发语言·javascript·three.js·贴图·three
程序员小淞1 个月前
1、如何本地部署Threejs官网文档
前端·three.js
布兰妮甜1 个月前
Three.js 扩展与插件:增强3D开发的利器
javascript·3d·three.js·扩展与插件
布兰妮甜1 个月前
Three.js 性能优化:打造流畅高效的3D应用
javascript·3d·性能优化·three.js
MossGrower1 个月前
58. Three.js案例-创建一个带有红蓝配置的半球光源的场景
three.js·webglrender·hemispherelig·spheregeometry
新中地GIS开发老师1 个月前
80个Three.js 3D模型资源
javascript·数码相机·3d·arcgis·three.js·gis开发·地信
布兰妮甜1 个月前
Three.js 数学工具:构建精确3D世界的基石
javascript·3d·three.js·数学工具