Skip to content

65. PBR 材质:逼真的毛绒、虹彩效果

Published:

前面学了 PBR 材质 MeshPhysicalMaterial 的透光度 transmission、清漆 clearcoat 属性,可以用来实现玻璃、喷了一层漆的车身的效果。

image.png

这节继续来学习另外两种效果:

image.png

光泽层 sheen、虹彩层 iridescence

这俩什么意思呢?

我们知道,清漆 clearcoat 是在物体表面喷了一层漆,也就是有了清漆层的效果。

那光泽层 sheen 就是毛绒织物上面的一层毛绒反射的光,多一层毛绒的效果。

image.png

image.png

虹彩层 iridescence 则是在物体上多了一层油膜,反射七彩光的效果。

image.png

就不创建新项目了,继续在 pbr-material 那个项目里写:

用 TorusGeometry 创建个圆环,我们来搞一个抱枕:

image.png

创建 mesh4.js

import * as THREE from 'three';
import GUI from 'three/examples/jsm/libs/lil-gui.module.min.js';

const geometry = new THREE.TorusGeometry(300, 100);
const material = new THREE.MeshPhysicalMaterial({
    color: 'blue'
});

const mesh = new THREE.Mesh(geometry, material);

export default mesh;

引入看一下:

image.png

npm run dev

image.png

image.png

现在并没有毛绒的感觉。

设置下光泽层强度、光泽层粗糙度、光泽层颜色:

image.png

const material = new THREE.MeshPhysicalMaterial({
    color: 'blue',
    sheen: 1,
    sheenRoughness: 1,
    sheenColor: 'white'
});

看下效果:

image.png

是不是就明显有一层毛绒的感觉了?

这层光泽层也可以设置纹理。

比如把之前的砖墙的图片拿过来:

zhuan.jpg

放到 public 目录下:

image.png

加一下光泽层颜色贴图看下效果:

image.png

const loader = new THREE.TextureLoader();
const texture = loader.load('./zhuan.jpg');
texture.colorSpace = THREE.SRGBColorSpace;

const geometry = new THREE.TorusGeometry(300, 100);
const material = new THREE.MeshPhysicalMaterial({
    color: 'blue',
    sheen: 1,
    sheenRoughness: 1,
    sheenColor: 'white',
    sheenColorMap: texture
});

image.png

这样毛绒的光泽层就有纹理了。

然后再来试一下虹彩层 iridescence:

创建 mesh5.js

import * as THREE from 'three';
import GUI from 'three/examples/jsm/libs/lil-gui.module.min.js';

const textureCube = new THREE.CubeTextureLoader()
    .setPath('./city/')
    .load(['px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png']);

const geometry = new THREE.SphereGeometry(300);
const material = new THREE.MeshPhysicalMaterial({
    color: '#ffffff',
    metalness: 0,
    roughness: 0,
    transmission: 1,
    envMap: textureCube
});

const gui = new GUI();
gui.addColor(material, 'color');


const mesh = new THREE.Mesh(geometry, material);

export default mesh;

首先创建一个球体,设置金属度为 0、粗糙度为 0,然后透光度为 1

环境贴图换了一套城市的:

image.png

之前的森林的太杂乱了。

你可以从这里下载。

image.png

放到 public 目录下:

image.png

然后 main.js 设置下 scene 的背景:

image.png

看下效果:

image.png

现在就是一个透明的气泡的效果。

然后我们给它加上虹彩:

image.png

const material = new THREE.MeshPhysicalMaterial({
    color: '#ffffff',
    metalness: 0,
    roughness: 0,
    transmission: 1,
    envMap: textureCube,
    iridescence: 1,
    iridescenceIOR: 1.8,
    reflectivity: 1,
});

const gui = new GUI();
gui.addColor(material, 'color');
gui.add(material, 'iridescence', 0, 1);
gui.add(material, 'iridescenceIOR', 1, 2.33);
gui.add(material, 'reflectivity', 0, 1);

iridescence 是虹彩层强度,iridescenceIOR 是虹彩层折射率,reflectivity 是反射率。

看下效果:

image.png

现在是不是就有一层虹彩层的感觉了?

对比下之前的:

image.png

效果很明显。

调解下 iridescenceIOR 虹彩层折射率:

虹彩层折射率 1.4

image.png

虹彩层折射率 1.2

image.png

都是不同的效果,这个可视化调就行。

反射率 reflectivity 是反射光线的多少,调低一下看下效果:

image.png

可以看到,反射的光线比刚才淡了。

案例代码上传了小册仓库

总结

这节我们学了 PBR 材质的毛绒和虹彩效果。

毛绒就是给物体加了一个光泽层 sheen,可以调节这个光泽层的粗糙度 sheenRoughness,光泽层的颜色 sheenColor,还可以设置光泽层颜色贴图 sheenColorMap

虹彩则是给物体加了一个虹彩层 iridescence,可以调节虹彩层折射率 iridescenceIOR,反射率 reflectivity

当然,大家知道 PBR 材质可以做啥效果就行,具体的参数可以用 GUI 可视化的调试。

评论