three.js学习(7)

169 阅读3分钟

9.环境遮挡贴图与强度

与透明材质类似,也是使用到一个黑白的图片,黑色的部分会暗下去,在真实的灯光下会有阴影,遮挡贴图就起到这个作用。

首先定义它,并加到材质中

 const stoneAoTexture = textureLoader.load("./textures/ao.jpg")
 ​
 //几何体
 const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1)
 //材质
 const basicMaterial = new THREE.MeshBasicMaterial({
     map: stoneColorTexture,
     transparent: true, 
     aoMap: stoneAoTexture,//遮挡贴图
     aoMapIntensity: 0.5,  //设置遮挡强度
     side: THREE.DoubleSide
 })
 const cube = new THREE.Mesh(cubeGeometry, basicMaterial)
 scene.add(cube)

需要设置第二组uv来给这个遮挡贴图,也就是把原来图案的uv给到这个贴图。

 cubeGeometry.setAttribute('uv2', new THREE.BufferAttribute(cubeGeometry.attributes.uv.array, 2))//两个值作为一点

把几何体的平面图uv设置给遮挡贴图。平面也是一样

 //添加平面
 const planeGeometry = new THREE.PlaneBufferGeometry(1, 1)
 const plane = new THREE.Mesh(
     planeGeometry, basicMaterial
 )
 plane.position.set(3, 0, 0)
 scene.add(plane)
 ​
 //给平面设置第二组uv
 planeGeometry.setAttribute('uv2', new THREE.BufferAttribute(planeGeometry.attributes.uv.array, 2)) 

10.PBR物理渲染

什么是PBR

基于物理渲染,以前的渲染是在模仿灯光的外观,现在是在模仿灯光的实际行为

PBR的组成部分

  1. 灯光属性:直接照明、间接照明、直接高光、间接高光、阴影、环境光闭塞。
  2. 表面属性:基础色、法线、高光、粗糙度、金属度。

灯光属性

1.光线类型

入射光:

  • 直接照明:直接从光源发射到阴影物体表面的光
  • 间接照明:环境光和直接光经过反弹第二次进入的光

反射光:

  • 镜面光:在经过表面反射聚集在同一方向上进入人眼的高亮光
  • 漫反射:光被散射并沿着各个方向离开表面

光与表面相互作用类型

  • 直接漫反射:来自光源的光被表面散射的光。
  • 直接高光:来自光源并被表面集中反射的光。
  • 间接漫反射:来自环境的光被表面散射的光。
  • 间接高光:来自环境并被表面集中反射的光。

表面属性

基础色

法线

镜面

粗糙度

金属度

11.标准网格材质与光照物理效果

在THREE.JS中,MeshStandardMaterial标准网格材质是一种基于物理的渲染(PBR)的标准材质。

那这里我们先把原来的基础材质替换成这个标准网格材质。

 const standardMaterial = new THREE.MeshStandardMaterial({
     //下面都不用改
     map: stoneColorTexture,
     // alphaMap: stoneAlphaTexture,
     transparent: true,
     aoMap: stoneAoTexture,
     aoMapIntensity: 0.8,
     side: THREE.DoubleSide
 })

但这个时候我们发现,网页上看到我们的物体是黑的!为什么呢,因为没有灯光

AmbientLight环境光

环境光会均匀的照亮场景中的所有物体,不能用来投射阴影,因为它没有方向。

 //灯光
 const light = new THREE.AmbientLight(0xffffff, 0.1) //颜色,强度
 scene.add(light)

DirectionalLight平行光

平行光是沿着特定方向发射的光。平行光是可以设置 光源位置position目标位置target 的。

 //直线光(平行光)
 const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5)
 directionalLight.position.set(10, 10, 10)
 scene.add(directionalLight)

12.置换贴图与顶点细分设置

除了前面使用过的透明贴图遮挡贴图之外,还有高度贴图金属贴图等等。

置换贴图 .displacementMap

也是使用一张黑白灰的图。越白呢就会越突出。

 //导入置换贴图
 const stoneHeightTexture = textureLoader.load("./textures/ao.jpg")
 ​
     //材质
 const standardMaterial = new THREE.MeshStandardMaterial({
     displacementMap:stoneHeightTexture,//置换贴图
     displacementScale:0.1,//置换的影响程度 默认是1
 })

但是呢,这样还不足以让它显示,因为没有足够的点让它去把贴图贴上去。这个时候我们就要看到我们的几何体的构造器了。

先拿平面举例子,之前我们只用到了两个参数,就是width、height,而它后面还有两个参数分别是widthSegments平面的宽度分段数heightSegments平面的高度分段数

像这样修改

 //添加平面
 const planeGeometry = new THREE.PlaneBufferGeometry(1, 1, 200, 200)

那么在平面是这样,在Box也是 只不过有三个参数。

 //几何体
 const cubeGeometry = new THREE.BoxBufferGeometry(1, 1, 1, 100, 100, 100)

当然后面的点给的越多效果就会越逼真,但是要是给得太多的话,可能就要闻到烧烤的香味了哈哈哈。