Skip to content

透明度贴图_环境贴图加载与高光贴图配合使用

代码

js
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js';
// 导入 hdr 加载器
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';

const scene = new THREE.Scene();

const camera = new THREE.PerspectiveCamera(
  45,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
)

const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)

camera.position.z = 5;
camera.position.y = 2;
camera.position.x = 2;
camera.lookAt(0, 0, 0)

const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;

function animate() {
  requestAnimationFrame(animate)
  controls.update()
  renderer.render(scene, camera)
}

animate()

window.addEventListener('resize', () => {
  renderer.setSize(window.innerWidth, innerHeight)
  camera.aspect = window.innerWidth / window.innerHeight
  camera.updateProjectionMatrix()
})

let eventObj = {
  Fullscreen: function () {
    document.body.requestFullscreen()
  },
  ExitFullscreen: function () {
    document.exitFullscreen()
  }
}

const gui = new GUI()
gui.add(eventObj, 'Fullscreen').name('全屏')
gui.add(eventObj, 'ExitFullscreen').name('退出全屏')

// 平面几何体
let planeGeometry = new THREE.PlaneGeometry(1, 1)

// 创建纹理加载器
let textureLoader = new THREE.TextureLoader()
// 加载纹理
let texture = textureLoader.load('./texture/watercover/CityNewYork002_COL_VAR1_1K.png')

// 加载 ao 贴图
let aoMap = textureLoader.load('./texture/watercover/CityNewYork002_AO_1K.jpg')

// 透明度贴图
let alphaMap = textureLoader.load('./texture/door/height.jpg')

// 加载光照贴图
let lightMap = textureLoader.load('./texture/colors.png')

// 加载高光贴图
let specularMap = textureLoader.load('./texture/watercover/CityNewYork002_GLOSS_1K.jpg')

// rgbLoader 加载hdr贴图
let rgbLoader = new RGBELoader()
rgbLoader.load('./texture/Alex_Hart-Nature_Lab_Bones_2k.hdr', (envMap) => {
  // 设置球形贴图
  envMap.mapping = THREE.EquirectangularReflectionMapping
  // 设置环境贴图
  scene.background = envMap
  scene.environment = envMap // 环境贴图

  // 设置 plane 环境贴图
  planeMaterial.envMap = envMap
})

// 平面材质
let planeMaterial = new THREE.MeshBasicMaterial({
  color: 0xffffff,
  side: THREE.DoubleSide, // 双面显示
  // 设置纹理
  // map: texture
  // 允许透明
  transparent: true,
  // 设置 ao 贴图
  aoMap: aoMap,
  // 透明强度
  aoMapIntensity: 1,
  // 透明度贴图
  // alphaMap: alphaMap,
  // 设置光照贴图
  // lightMap: lightMap,
  // 反射强度
  reflectivity: 0.3,

  // 高光贴图
  specularMap: specularMap,
})

// 设置纹理
planeMaterial.map = texture

let plane = new THREE.Mesh(planeGeometry, planeMaterial)

scene.add(plane)


gui.add(planeMaterial, 'aoMapIntensity').min(0).max(1).name('ao强度')

Released under the MIT License.