Three.js 辉光-postprocessing教程

📅 2026/7/1 12:06:06
Three.js 辉光-postprocessing教程
辉光-postprocessing ·Select Bloom· ▶ 在线运行案例案例合集三维可视化功能案例threehub.cn开源仓库github地址https://github.com/z2586300277/three-cesium-examples400个案例代码:网盘链接你将学到什么EffectComposer 多 Pass 后期处理管线OrbitControls 相机轨道交互Raycaster 鼠标拾取与交互requestAnimationFrame渲染循环与resize自适应效果说明本案例演示辉光-postprocessing效果原场景渲染后经 EffectComposer 叠加 Bloom/模糊等全屏后期支持鼠标拾取、绘制或拖拽交互核心用到 EffectComposer、OrbitControls、Raycaster。建议先打开文首在线案例查看动态画面再对照下方源码逐步理解。核心概念Scene / Camera / WebGLRenderer构成最小渲染闭环大场景可开logarithmicDepthBuffer缓解 Z-fighting。EffectComposer以多 Pass 链式渲染RenderPass → 特效 Pass → 输出屏幕替代直接renderer.render。OrbitControls提供轨道旋转/缩放开启enableDamping后需在 animate 中controls.update()。Raycaster将屏幕坐标转为射线与场景求交得到世界坐标常用于绘制/拾取。实现步骤搭建 Scene、PerspectiveCamera、WebGLRenderer挂载 canvas 并处理resize组装 EffectComposer Pass 链在 animate 中调用composer.render()创建 OrbitControls及 Raycaster 等交互控件若源码包含在requestAnimationFrame循环中更新状态并 renderCesium 为viewer.render或自动渲染代码要点import * as THREE from threeimport { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { BlendFunction, SelectiveBloomEffect, EffectComposer, EffectPass, RenderPass } from postprocessing;const box document.getElementById(box)const scene new THREE.Scene()const camera new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 1000)camera.position.set(0, 5, 5)const renderer new THREE.WebGLRenderer({ antialias: true, alpha: true })renderer.setSize(box.clientWidth, box.clientHeight)box.appendChild(renderer.domElement)new OrbitControls(camera, renderer.domElement)window.onresize () {renderer.setSize(box.clientWidth, box.clientHeight)camera.aspect box.clientWidth / box.clientHeightcamera.updateProjectionMatrix()}// 附加后处理库 const composer new EffectComposer(renderer);const bloomEffect new SelectiveBloomEffect(scene, camera, {blendFunction: BlendFunction.ADD,mipmapBlur: true,luminanceThreshold: 0.4,luminanceSmoothing: 0.2,intensity: 3.0})composer.addPass(new RenderPass(scene, camera))composer.addPass(new EffectPass(camera, bloomEffect))// 添加10个立方体 const boxGeometry new THREE.BoxGeometry(1, 1, 1)const boxMaterial new THREE.MeshBasicMaterial({ color: 0xa0dee2 })const boxMaterial2 new THREE.MeshBasicMaterial({ color: yellow })const box1 new THREE.Mesh(boxGeometry, boxMaterial)const box2 new THREE.Mesh(boxGeometry, boxMaterial2)box1.position.set(-1.5, 0, 0)scene.add(box1, box2)bloomEffect.selection.set([box1], true)// 点击立方体时高亮立方体 box.addEventListener(click, e {const raycaster new THREE.Raycaster()const mouse new THREE.Vector2((e.offsetX / e.target.clientWidth) * 2 - 1,-(e.offsetY / e.target.clientHeight) * 2 1)raycaster.setFromCamera(mouse, camera)const intersects raycaster.intersectObjects(scene.children)if (intersects.length 0) {const object intersects[0].objectbloomEffect.selection.toggle(object);}})// 渲染 function animate() {requestAnimationFrame(animate)composer.render()}animate()完整源码GitHub小结本文提供辉光-postprocessing完整 Three.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库