因为目前还没有学习到涉及灯光的东西,我们依然使用基础网格材质来做演示!
基础纹理贴图
纹理贴图是一种在三维模型表面上应用图像的方法,通过设置材质的
map
属性来指定一个纹理贴图
// 球体几何体
const circleGeomertry = new THREE.SphereGeometry(1)
const textureLoader = new THREE.TextureLoader()
// 加载纹理贴图
const texture = textureLoader.load('/36.png')
const material = new THREE.MeshBasicMaterial({
map: texture,
})
const circleMesh = new THREE.Mesh(circleGeomertry, material)
scene.add(circleMesh)
alphaMap 透明度贴图
根据贴图的黑白设置材质的透明度
完全黑色代表完全透明,反正完全白色代表完全不透明
下面是一张用来测试透明贴图的!
const innerSphereGeomery = new THREE.SphereGeometry(1)
const innerSphereMetaril = new THREE.MeshBasicMaterial({color:0xff0000})
const innerSphereMesh = new THREE.Mesh(
innerSphereGeomery,
innerSphereMetaril
)
scene.add(innerSphereMesh)
现在内部做一个红色的球!基础默认材质红色!
然后外面使用一个 Box 使用透明贴图!开启 transparent!
const boxGeomertry = new THREE.BoxGeometry(2, 2, 2)
const textureLoader = new THREE.TextureLoader()
const texture = textureLoader.load('/textures/Glass_Window_003_opacity.jpg')
const boxMaterial = new THREE.MeshBasicMaterial({
alphaMap: texture,
transparent: true,
})
const circleMesh = new THREE.Mesh(boxGeomertry, boxMaterial)
scene.add(circleMesh)
看下效果!
可以看到根据透明贴图的计算方式,黑色的部分都是透明的,所以我们可以透过外部的盒子看到内部的球体!
AO (Ambient Occlusion)贴图 环境遮挡贴图
aoMap(ambient occlusion map)环境遮挡贴图。它将在纹理较暗的地方添加阴影,让物体看起来更加的真实!
我们通过一个环境贴图来确定哪里是阴影部分(黑色,灰色部分是我们要添加阴影的地方!)
const boxMaterial = new THREE.MeshBasicMaterial({
map: baseTexture,
alphaMap: alphTexture,
transparent: true,
aoMap: aoTexture,
aoMapIntensity: 1,
})
// 通过 GUI 设置 .aoMapIntensity : Float 来控制环境遮挡效果的强度。默认值为1。0是不遮挡效果。
gui.add(boxMaterial, 'aoMapIntensity').min(0).max(10)
可以看得出 aoMap 环境遮挡贴图 确实能让物体营造出遮挡区域的阴影感觉,让物体看起来更真实!
HDR了解与使用HDR贴图
高动态范围成像(英语:High Dynamic Range Imaging,简称HDRI或HDR),在计算机图形学与电影摄影术中,是用来实现比普通数位图像技术更大曝光动态范围(即更大的明暗差别)的一组技术。高动态范围成像的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度。
那么three.js也提供了hdr文件类型的贴图支持,使用hdr让我们的贴图效果更好!
那么这里我们呢就需要使用 DataTextureLoader
这个loader 来加载我们的hdr
文件!
DataTextureLoader 用于加载二进制文件格式的(rgbe, hdr, …)的抽象类。 内部使用FileLoader,来加载文件, 和创建一个新的 DataTexture
那么我们这里加载 hdr
文件呢是使用 THREE.JS 提供的一个 RGBLoader 去加载的!
rgbeLoader.load('/distribution_board_2k.hdr', map => {
scene.background = map
})
看起来好像不太对~因为这里贴图的映射(mapping是不对的).mapping : number (图像将如何应用到物体(对象)上。
默认值是THREE.UVMapping 对象类型, 即UV坐标将被用于纹理映射。)
那么其实,我们使用HDR贴图的时候,应该使用,等距圆柱投影的环境贴图,也被叫做经纬线映射贴图 (EquirectangularReflectionMapping 和 EquirectangularRefractionMapping)
可以理解为是把 原hdr的矩形图卷起来变成圆柱。
rgbeLoader.load('/distribution_board_2k.hdr', map => {
scene.background = map
map.mapping = THREE.EquirectangularReflectionMapping
})
envMap 环境贴图
Three.js 中的环境贴图(Environment Map)通常用于模拟反射或折射,使物体看起来像是处于特定环境中。环境贴图是一种纹理,它反映了场景中的周围环境。这通常通过将一个全景图像(如球形全景图)投射到物体周围来实现。
比如上面的,我们想让物体看起来更真实的处于当前环境中,可以设置物体材质的envMap 为当前场景的环境贴图!
rgbeLoader.load('/distribution_board_2k.hdr', map => {
scene.background = map
scene.environment = map
map.mapping = THREE.EquirectangularReflectionMapping
boxMaterial.envMap = map
})
就是这么个效果,物体表面根据周围环境进行反射,反映所处的环境!
specularMap高光贴图
在Three.js中,specularMap
是一种用于定义物体表面镜面高光(specular highlights)的纹理。这个属性允许你为物体的表面指定一个单独的纹理,用来控制镜面高光的强度和分布。
镜面高光是光线反射到观察者眼睛的方向上的强烈反射,通常出现在光源的直接照射下。
通过指定specularMap
,你可以定义哪些区域应该具有更强的镜面高光,哪些区域应该更加柔和,或者甚至是完全没有镜面高光。
设置一张高光贴图( 越接近黑色的反射率越差 )
const heightTexture = textureLoader.load(
'/vent/Metal_Vent_006_height.png'
)
const boxMaterial = new THREE.MeshBasicMaterial({
map: baseTexture,
alphaMap: alphTexture,
transparent: true,
aoMap: aoTexture,
aoMapIntensity: 1,
specularMap:heightTexture,
reflectivity:1,
})
评论区