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

Three.js 环彩虹着色器教程

环彩虹着色器 ·Rings 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(75, box.clientWidth / box.clientHeight, 0.1, 1000) camera.position.set(0, 0, 10) const renderer = new THREE.WebGLRenderer() renderer.setSize(box.clientWidth, box.clientHeight) box.appendChild(renderer.domElement) new OrbitControls(camera, renderer.domElement) scene.add(new THREE.AxesHelper(50000)) window.onresize = () => { renderer.setSize(box.clientWidth, box.clientHeight) camera.aspect = box.clientWidth / box.clientHeight camera.updateProjectionMatrix() }

    const { mesh, uniforms } = getShaderMesh() scene.add(mesh)

    animate() function animate() { uniforms.iTime.value += 0.01 requestAnimationFrame(animate) renderer.render(scene, camera) }

    function getShaderMesh() {

    const uniforms = { iTime: { value: 0 }, iResolution: { value: new THREE.Vector2(1900, 1900) }, iChannel0: { value: window.iChannel0 } }

    const geometry = new THREE.PlaneGeometry(20, 20); const material = new THREE.ShaderMaterial({ uniforms, side: 2, depthWrite: false, transparent: true, vertexShader:varying vec3 vPosition; varying vec2 vUv; void main() { vUv = uv; vec4 mvPosition = modelViewMatrix * vec4(position, 1.0); gl_Position = projectionMatrix * mvPosition; }, fragmentShader:uniform float ratio;

    float PI = 3.1415926; uniform float iTime; uniform vec2 iResolution; varying vec2 vUv; void main() { vec2 p = (vUv - 0.5) * 2.0; float tau = PI * 2.0; float a = atan(p.x,p.y); float r = length(p)*0.75; vec2 uv = vec2(a/tau,r); //get the color float xCol = (uv.x - (iTime / 3.0)) * 3.0; xCol = mod(xCol, 3.0); vec3 horColour = vec3(0.25, 0.25, 0.25); if (xCol < 1.0) { horColour.r += 1.0 - xCol; horColour.g += xCol; } else if (xCol < 2.0) { xCol -= 1.0; horColour.g += 1.0 - xCol; horColour.b += xCol; } else { xCol -= 2.0; horColour.b += 1.0 - xCol; horColour.r += xCol; }

    // draw color beam uv = (2.0 * uv) - 1.0; float beamWidth = (0.7+0.5cos(uv.x10.0tau0.15clamp(floor(5.0 + 10.0cos(iTime)), 0.0, 10.0)))abs(1.0 / (30.0uv.y)); vec3 horBeam = vec3(beamWidth); gl_FragColor = vec4((( horBeam) * horColour), 1.0); }}) const mesh = new THREE.Mesh(geometry, material);

    return { mesh, uniforms } }

    完整源码:GitHub

    小结

    • 本文提供环彩虹着色器完整 Three.js 源码与在线 Demo,建议先运行案例再改 uniform/参数做二次实验
    • 更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库
http://www.jsqmd.com/news/1151068/

相关文章:

  • 定制AI研究报告:把零散的调研素材变成一份精美的全案分析报告
  • 2026烟台景区AI导览服务商排行榜:智慧文旅解决方案能力盘点
  • 影刀RPA Excel条件格式与数据条自动设置:让报表一眼看出问题
  • PVNet 关键点检测实战:YCB-Video数据集 6D位姿估计,PnP求解误差低于 2cm
  • 驾照翻译盖章办理:从材料准备到拿到盖章件,看这篇就够了
  • 145.标准化工程开发!解决扫描周期、信号毛刺、状态卡死五大工业难题
  • PIC18F26K40驱动CMT-8540S-SMT音频模块实战指南
  • 烟台企业老板和高管需要学AI吗?管理层AI战略思维培训课程解析
  • 语音克隆技术解析:基于检索的语音转换WebUI架构设计与深度实践
  • 如何用普通摄像头实现专业级3D动作捕捉:零成本获取BVH动画数据
  • Fast-ParC 全局卷积:FFT加速实现O(n log n),ImageNet分类涨点1.2%
  • 5分钟掌握暗黑破坏神2存档编辑器:可视化修改角色装备的终极指南
  • 2026年在线朗读工具实测对比:面向学生职场人,谁才是好用王者
  • MCP3428与TM4C1294NCZAD在工业数据采集中的高精度应用
  • 锂离子电池组电压平衡技术及硬件实现
  • 155、DFL 分布焦点损失源码拆解:从 delta 分布到 16 个离散概率值的完整推导
  • 爆料:iPhone 18 Pro 系列电池容量提升,Pro Max 增加 479 毫安时
  • 工业负载控制方案:TPD2017FN与STM32F469II的精准驱动设计
  • 视图(View)是数据库中的一种虚拟表,它并不实际存储数据,而是基于一个 `SELECT` 查询语句动态生成的结果集
  • 机器学习 3 大核心任务实战:从回归、分类到聚类,Python 代码全解析
  • 初心不改 为大家看好牙
  • 【SpringCloud Alibaba】Spring Boot + Spring Cloud 微服务面试核心20问
  • 基于STM32单片机宠物自动喂食系统喂水控制系统 WIFI监控宠物喂养12(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • Three.js 方块着色器教程
  • 具有多孔光纤的偏振分束器
  • ddddocr vs 百度OCR:woff2 字体反爬 363 字符识别准确率与成本对比
  • 索尼相机终极解锁指南:3分钟开启隐藏的30+语言和无限录制功能
  • 基于MCP3202与PIC18的锂电池组电压平衡方案
  • 智能SQL审核系统设计:用LLM检测危险DDL并生成安全替代方案
  • AI 电动节日灯串智能驱动 MOSFET 完整选型方案