Skip to content

62. PBR 材质:逼真的喷漆、玻璃效果

Published:

上节学了用 PBR 材质实现金属、塑料、磨砂效果,这节我们继续来学习喷漆、玻璃效果。

比如这种车身:

image.png

就是喷了一层漆的效果,可以用 PBR 材质实现。

上面的车窗玻璃,也可以用 PBR 材质,它支持透光。

但这次不是用 MeshStandardMaterial 标准网格材质,而是 MeshPhysicalMaterial 物理网格材质:

image.png

它扩展自 MeshStandardMaterial,也是 PBR 材质,但是能实现更多效果。

比如清漆,就是喷了一层车漆的效果,还有虹彩,比如肥皂泡的效果,还有玻璃等透光材质的效果

我们在上节的代码里继续写:

创建 mesh2.js

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

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

const geometry = new THREE.DodecahedronGeometry(300);
const material = new THREE.MeshPhysicalMaterial({
    color: 'blue',
    metalness: 0,
    roughness: 0,
    envMap:textureCube,
    transmission: 0.9,
    ior: 1.8,
});

const gui = new GUI();
gui.addColor(material, 'color');
gui.add(material, 'transmission', 0, 1);
gui.add(material, 'ior', 0, 2.33);

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

export default mesh;

这里用十二面几何体 DodecahedronGeometry

我们先试下玻璃材质。

玻璃的话金属度 metalness 肯定是 0,光滑的玻璃粗糙度 roughness 也是 0

透光率 transmission 设置 0.9,差不多完全透光,ior 折射率范围是 0 到 2.33

我们先引入看下效果:

image.png

image.png

可以看到,现在就有一种玻璃的感觉。

调节下透光度 transmission:

透光度 1:

image.png

透光度 0.15

image.png

折射率 ior 1.1

image.png

折射率 ior 2.33

image.png

都是不同的材质的效果。

粗糙度设置 0.5

image.png

image.png

这样就是磨砂玻璃的效果了。

然后再来试一下清漆效果:

创建 mesh3.js

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

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

const geometry = new THREE.BoxGeometry(300, 300, 300);
const material = new THREE.MeshPhysicalMaterial({
    color: 'black',
    metalness: 0.8,
    roughness: 0.4,
    clearcoat: 1,
    clearcoatRoughness: 0.05,
    envMap: textureCube
});

const gui = new GUI();
gui.addColor(material, 'color');
gui.add(material, 'metalness', 0, 1);
gui.add(material, 'roughness', 0, 1);
gui.add(material, 'clearcoat', 0, 1);
gui.add(material, 'clearcoatRoughness', 0, 1);


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

export default mesh;

想象一下车身的这种材质:

image.png

金属度设置个 0.8 就差不多了,粗糙度设置 0.4

然后设置清漆 clearcoat 也就是在上面喷一层油漆的感觉

image.png

clearcoatRoughness 就是这一层漆的粗糙度。

引入看一下效果:

image.png

image.png

是不是就有种车身材质的感觉了?

清漆度调成 0.1

image.png

那一层漆就感觉薄了很多。

调大一下清漆层粗糙度 clearcoatRoughness

image.png

就有种磨砂感了。

这样,基于 PBR 材质,我们就可以实现车身、玻璃的效果:

image.png

案例代码上传了小册仓库

总结

这节我们学了另一个 PBR 材质,扩展自标准网格材质 MeshStandardMaterial 的物理网格材质 MeshPysicalMaterial。

它除了可以调节金属度 metalness、粗糙度 roughness 外,还可以调节清漆度 clearcoat 和清漆层粗糙度 clearcoatRoughness 实现喷漆效果,就是车身的那种感觉,可以调节 transmission 透光度和折射率 ior 实现玻璃效果。

玻璃、宝石、喷漆等效果都可以通过 PBR 材质调出来。

下节我们来加载一个汽车模型,看下 PBR 材质可以做的多逼真。

评论