Three.js 网格材质教程

发布时间:2026/7/16 16:12:47
Three.js 网格材质教程 网格材质 ·Gird Material· ▶ 在线运行案例案例合集三维可视化功能案例threehub.cn开源仓库github地址https://github.com/z2586300277/three-cesium-examples400个案例代码:网盘链接你将学到什么ShaderMaterial 自定义着色器实现核心视觉效果OrbitControls 相机轨道交互requestAnimationFrame渲染循环与resize自适应效果说明本案例演示网格材质效果基于 WebGL 实现「网格材质」可视化效果附完整可运行源码核心用到 ShaderMaterial、OrbitControls。建议先打开文首在线案例查看动态画面再对照下方源码逐步理解。核心概念Scene / Camera / WebGLRenderer构成最小渲染闭环大场景可开logarithmicDepthBuffer缓解 Z-fighting。ShaderMaterial通过uniforms 自定义 GLSL 控制逐像素/逐点效果透明粒子常配合depthTest: false。OrbitControls提供轨道旋转/缩放开启enableDamping后需在 animate 中controls.update()。实现步骤搭建 Scene、PerspectiveCamera、WebGLRenderer挂载 canvas 并处理resize定义 uniforms / onBeforeCompile 或 ShaderMaterial编写 GLSL 与材质参数创建 OrbitControls及 Raycaster 等交互控件若源码包含在requestAnimationFrame循环中更新状态并 renderCesium 为viewer.render或自动渲染代码要点import * as THREE from threeimport { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GUI } from dat.guiconst box document.getElementById(box)const scene new THREE.Scene()const camera new THREE.PerspectiveCamera(75, box.clientWidth / box.clientHeight, 0.1, 100000)camera.position.set(50, 50, 50)const renderer new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true })renderer.setSize(box.clientWidth, box.clientHeight)box.appendChild(renderer.domElement)new OrbitControls(camera, renderer.domElement)scene.add(new THREE.AxesHelper(100), new THREE.GridHelper(100, 10))// 通用网格材质 const gridMaterial new THREE.ShaderMaterial({ transparent: true, side: THREE.DoubleSide, uniforms: { color: { value: new THREE.Color(0x00caea) }, gridX: { value: 40.0 }, gridY: { value: 20.0 }, lineWidth: { value: 0.6 } }, vertexShader:varying vec2 vUv; void main() { vUv uv; gl_Position projectionMatrixmodelViewMatrixvec4(position, 1.0); }, fragmentShader:uniform vec3 color; uniform float gridX; uniform float gridY; uniform float lineWidth; varying vec2 vUv; void main() { vec2 grid vec2(gridX, gridY); vec2 f fract(vUv * grid); vec2 df fwidth(vUv * grid); vec2 line smoothstep(dflineWidth, dflineWidth2.0, f)smoothstep(dflineWidth, dflineWidth * 2.0, 1.0 - f); float alpha 1.0 - min(line.x, line.y); if (alpha 0.1) discard; gl_FragColor vec4(color, alpha); }})// 几何体列表 const geometries { TorusKnot: new THREE.TorusKnotGeometry(15, 4, 100, 16), Cylinder: new THREE.CylinderGeometry(15, 15, 40, 64), Sphere: new THREE.SphereGeometry(20, 64, 32), Torus: new THREE.TorusGeometry(15, 5, 32, 64), Box: new THREE.BoxGeometry(30, 30, 30), Cone: new THREE.ConeGeometry(15, 40, 64), Capsule: new THREE.CapsuleGeometry(10, 20, 16, 32) }const mesh new THREE.Mesh(geometries[TorusKnot], gridMaterial) scene.add(mesh)// GUI 控制 const gui new GUI() const params { geometry: TorusKnot, color: #00ffff }gui.add(params, geometry, Object.keys(geometries)).name(几何体).onChange(v mesh.geometry geometries[v]) gui.add(gridMaterial.uniforms.gridX, value, 1, 100).name(横向网格) gui.add(gridMaterial.uniforms.gridY, value, 1, 100).name(纵向网格) gui.add(gridMaterial.uniforms.lineWidth, value, 0.1, 5).name(线条粗细) gui.addColor(params, color).name(颜色).onChange(v gridMaterial.uniforms.color.value.set(v))function animate() { requestAnimationFrame(animate) renderer.render(scene, camera) }animate()window.onresize () { renderer.setSize(box.clientWidth, box.clientHeight) camera.aspect box.clientWidth / box.clientHeight camera.updateProjectionMatrix() }完整源码GitHub小结本文提供网格材质完整 Three.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库