材质与纹理
大约 2 分钟约 725 字
使用纹理
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 创建场景
const scene = new THREE.Scene()
// 创建相机
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
)
// 设置相机位置
camera.position.set(2, 2, 2)
// 将相机添加到场景
scene.add(camera)
// 加载纹理
const doorTexture = new THREE.TextureLoader().load(
'/src/assets/textures/door/color.jpg'
)
// 使用纹理进行材质创建
const material = new THREE.MeshBasicMaterial({ map: doorTexture })
// 创建几何体
const geometry = new THREE.BoxBufferGeometry()
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(geometry, material)
// 将几何体添加到场景中
scene.add(cube)
// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)
// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement)
// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
// 阻尼效果
controls.enableDamping = true
// 渲染函数
function render() {
renderer.render(scene, camera)
// 渲染下一帧的时候就会调用render函数
requestAnimationFrame(render)
// controls.update()
}
render()
纹理常用属性
偏移
取值:0.1 ~ 1.0
doorTexture.offset.set(-0.2, 0)
旋转
doorTexture.rotation = 45
doorTexture.center.set(0.5, 0.5)
旋转中心点为(0.5, 0.5)对应纹理的正中心。默认值为(0,0),即左下角
重复
doorTexture.repeat.set(2, 3)
wrapS
这个值定义了纹理贴图在水平方向上将如何包裹,在 UV 映射中对应于U。 默认值是THREE.ClampToEdgeWrapping
,即纹理边缘将被推到外部边缘的纹素(纹理元素)。 其它的两个选项分别是THREE.RepeatWrapping
和THREE.MirroredRepeatWrapping
。
wrapT
这个值定义了纹理贴图在垂直方向上将如何包裹,在 UV 映射中对应于 V。和wrapS
使用相同的选项
doorTexture.repeat.set(2, 3)
doorTexture.wrapT = THREE.RepeatWrapping // 简单重复
doorTexture.wrapS = THREE.MirroredRepeatWrapping // 镜像重复
纹理显示算法
magFilter
当一个纹素覆盖大于一个像素时,贴图将如何采样:
// 纹理显示算法
doorTexture.magFilter = THREE.NearestFilter
Mipmap 详解(有无 Mipmap 区别、原理、优点、缺点、优化)
透明材质与透明纹理
.alphaMap
:alpha
贴图 是一张灰度纹理,用于控制整个表面的不透明度(黑色:完全透明;白色:完全不透明)
.map
是颜色贴图;.transparent
定义此材质是否透明。设置为true
时,通过设置材质的opacity
属性来控制材质透明的程度;side
定义需要渲染那一面;默认是正面
// 加载透明纹理
const alphaTexture = new THREE.TextureLoader().load(
'/src/assets/textures/door/alpha.jpg'
)
// 使用纹理进行材质创建
const material = new THREE.MeshBasicMaterial({
map: doorTexture,
alphaMap: alphaTexture,
transparent: true,
opacity: 0.5,
side: THREE.DoubleSide
})
环境遮挡贴图与强度
aoMap
为环境遮挡贴图,它需要第二组UV
// 使用纹理进行材质创建
const material = new THREE.MeshBasicMaterial({
map: doorTexture,
alphaMap: alphaTexture,
// 材质是否透明
transparent: true,
// opacity: .4
side: THREE.DoubleSide,
aoMap: aoTexture
})
// 创建一个平面
const plance = new THREE.PlaneGeometry()
const cube2 = new THREE.Mesh(plance, material)
// 挪动平面至3,0,0
cube2.position.set(0, 0, 2)
// 给平面设置第二组UV
plance.setAttribute(
'uv2',
new THREE.BufferAttribute(plance.attributes.uv.array, 2)
)