news 2026/7/27 6:05:05

Three.js 发散着色器教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 开源仓库
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 6:03:21

全功能在线认证考试平台解决方案:解密传统认证四大核心痛点

在传统考试认证模式面临着功能分散、信息孤岛、作弊风险、证书管理低效等问题&#xff0c;已成为制约教育机构、企业及行业协会提升认证效率与公信力的关键瓶颈。考试云&#xff08;kaoshiyun&#xff09;作为一站式认证考试平台&#xff0c;以“学、练、考、证”全流程智能化为…

作者头像 李华
网站建设 2026/7/27 6:00:11

3D等变几何深度学习在分子长程相互作用建模中的应用与优化

1. 3D等变几何深度学习在分子长程相互作用建模中的应用在分子模拟领域&#xff0c;准确描述长程静电相互作用一直是个关键挑战。传统分子力场通常采用截断半径处理静电相互作用&#xff0c;这种方法虽然计算效率高&#xff0c;但会损失重要的物理效应。现代机器学习力场通过引入…

作者头像 李华
网站建设 2026/7/27 5:59:35

解决C/C++跨平台开发中strings.h缺失问题的完整指南

1. 问题现象与根源剖析 如果你在C或C项目中&#xff0c;突然遇到编译器报错&#xff0c;提示类似 fatal error: strings.h: No such file or directory 或者 cannot open source file "strings.h" &#xff0c;先别急着怀疑人生。这个错误在跨平台开发、特别是从…

作者头像 李华
网站建设 2026/7/27 5:59:19

PowerShell Copy-Item 递归复制深度解析:从基础到实战避坑指南

1. 项目概述&#xff1a;为什么需要深挖 Copy-Item 的递归复制&#xff1f;在 Windows 系统管理和自动化运维的日常里&#xff0c;文件操作是绕不开的基础课。无论是部署应用、备份数据&#xff0c;还是整理项目结构&#xff0c;复制文件夹及其所有子内容都是高频需求。很多朋友…

作者头像 李华
网站建设 2026/7/27 5:58:58

C++条件分支实现快递费用计算系统

1. 项目背景与题目解析这道来自CSP-X2021山东赛区的编程题目&#xff0c;要求参赛者用C实现一个快递费用计算系统。题目原型是典型的条件分支结构应用题&#xff0c;考察选手对基础语法和逻辑判断的掌握程度。这类题目在信息学奥赛初赛中非常常见&#xff0c;通常作为考察编程基…

作者头像 李华
网站建设 2026/7/27 5:58:49

字符分类函数与字符转化函数

前言:在c语言中有一系列的函数专门做字符分类&#xff0c;也就是判断一个字符是属于什么类型的&#xff0c;比如有数字字符124356789&#xff0c;大写字符ABCDE&#xff0c;小写字符abcde等等&#xff0c;这种函数的使用都需要包含一个头文件#include<ctype.h>一:字符分类…

作者头像 李华