当前位置: 首页 > news >正文

Three.js 发散着色器教程

发散着色器 ·Emit Shader· ▶ 在线运行案例

  • 案例合集:三维可视化功能案例(threehub.cn)
  • 开源仓库github地址:https://github.com/z2586300277/three-cesium-examples
  • 400个案例代码:网盘链接

你将学到什么

  • 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循环中更新状态并 render(Cesium 为viewer.render或自动渲染)
  • 代码要点

    import * as THREE from 'three'

    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'

    const box = document.getElementById('box')

    const scene = new THREE.Scene()

    const camera = new THREE.PerspectiveCamera(50, box.clientWidth / box.clientHeight, 0.1, 1000)

    camera.position.set(0, 10, 10)

    const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true })

    renderer.setSize(box.clientWidth, box.clientHeight)

    box.appendChild(renderer.domElement)

    const controls = new OrbitControls(camera, renderer.domElement)

    controls.enableDamping = true

    const boxGeometry = new THREE.BoxGeometry(6, 6, 6);

    const vertexShader =void main() { gl_Position = projectionMatrixmodelViewMatrixvec4(position, 1.0);

    }const fragmentShader =uniform vec2 u_resolution; uniform float iTime; vec3 palette( in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d ) { return a + bcos( 6.283185(c*t+d) ); } void main() { vec3 finalcol = vec3(0.0); vec2 uv = (gl_FragCoord.xy * 2. - u_resolution.xy) / u_resolution.y; vec2 uv0 = uv; for (float i = 0.0; i < 3.0; i++) { uv = fract(uv*5.5)-0.5; vec3 col = palette(length(uv0)+iTime,vec3(0.768, 0.648, 1.0), vec3(-0.252, -0.082, 0.0), vec3(0.5, 0.5, 0.0), vec3(0.5, 0.0, 0.0)); float d = length(uv) * exp(-length(uv0));

    d = sin(d*8. + iTime)/8.; d = abs(d);

    d = pow(0.01 / d, 1.2); finalcol += col * d; } gl_FragColor = vec4(finalcol, 1.0); }

    const boxMaterial = new THREE.ShaderMaterial({ uniforms: { u_resolution: { value: new THREE.Vector2(box.clientWidth, box.clientHeight) }, iTime: { value: 0 } }, vertexShader, fragmentShader });

    const boxMesh = new THREE.Mesh(boxGeometry, boxMaterial);

    scene.add(boxMesh);

    animate()

    function animate() {

    boxMaterial.uniforms.iTime.value += 0.01

    requestAnimationFrame(animate)

    controls.update()

    renderer.render(scene, camera)

    }

    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 开源仓库
http://www.cnnetsun.cn/news/3677129.html

相关文章:

  • 全功能在线认证考试平台解决方案:解密传统认证四大核心痛点
  • 3D等变几何深度学习在分子长程相互作用建模中的应用与优化
  • 解决C/C++跨平台开发中strings.h缺失问题的完整指南
  • PowerShell Copy-Item 递归复制深度解析:从基础到实战避坑指南
  • C++条件分支实现快递费用计算系统
  • 字符分类函数与字符转化函数
  • Unity责任链模式实战:游戏事件处理与代码解耦
  • 基于Whisper的Buzz离线语音转写工具全解析
  • DCQCN 拥塞控制算法原理和参数配置
  • 大模型内容生成对平台流量与创作者生态的影响分析
  • TMS320DM6446存储子系统实战:EMIF异步接口、DDR2与ATA/CF配置详解
  • 2026年1月C#/.NET生态技术演进与创新
  • PHP开源电商系统全解析:从部署到核心代码实战
  • LangChain链式调用实战:构建AI论文生成器
  • AI核心算法解析:A*搜索、粒子滤波与Q学习实战
  • 光伏微电网双下垂控制原理与Simulink仿真实践
  • UE C++开发中文乱码终极解决方案:从编码原理到工程实践
  • 北京三维动画公司怎么选?客户选型实用指南
  • 改进灰狼算法在无人机三维路径规划中的Matlab实现
  • 大语言模型自我笔记机制:提升复杂推理能力的技术解析与实践
  • 【单片机毕业设计推荐】基于 STM32 或 51 单片机的红外循迹智能小车设计与实现,基于 STM32 或 51 单片机的 L293D 驱动红外巡线小车系统设计(022203)
  • 90% 的人都搞错过的国外 AI 名词,一篇给你全理清楚
  • 强化学习在网络安全决策中的应用与优化
  • 2026年横评:16款降AIGC工具测评,TOP1竟是它!
  • LLM提示工程技术债务管理与治理框架
  • 基于曼哈顿距离的DDR3 PCB布线:TI AM389x系统信号完整性设计实战
  • Python性能优化与懒加载技术实践
  • 专业二维码生成器选购指南与实用技巧
  • 构建系统优化:增量编译与缓存命中率提升
  • Agent 工作流的异常处理:失败可恢复的执行设计