Three.js 方块着色器教程
方块着色器 ·Shader Block· ▶ 在线运行案例案例合集三维可视化功能案例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.jsconst 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, 10, 10) const renderer new THREE.WebGLRenderer() 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.clientHeight camera.updateProjectionMatrix() }const uniforms { iResolution: { type: v2, value: new THREE.Vector2(box.clientWidth, box.clientHeight) }, iTime: { type: f, value: 1.0 } } animate() function animate() { uniforms.iTime.value 0.01 requestAnimationFrame(animate) renderer.render(scene, camera) }let geometry new THREE.PlaneGeometry(2, 2);let material new THREE.ShaderMaterial({ uniforms: uniforms, vertexShader:void main() { gl_Position vec4( position, 1.0 ); }, fragmentShader:// 屏幕尺寸 precision highp float; uniform vec2 iResolution; uniform float iTime;float gTime 0.; const float REPEAT 5.0;// 回転行列 mat2 rot(float a) { float c cos(a), s sin(a); return mat2(c,s,-s,c); }float sdBox( vec3 p, vec3 b ) { vec3 q abs(p) - b; return length(max(q,0.0)) min(max(q.x,max(q.y,q.z)),0.0); }float box(vec3 pos, float scale) { pos * scale; float base sdBox(pos, vec3(.4,.4,.1)) /1.5; pos.xy * 5.; pos.y - 3.5; pos.xy * rot(.75); float result -base; return result; }float box_set(vec3 pos, float iTime) { vec3 pos_origin pos; pos pos_origin; pos .y sin(gTime0.4)2.5; pos.xy * rot(.8); float box1 box(pos,2. - abs(sin(gTime0.4))1.5); pos pos_origin; pos .y -sin(gTime0.4)2.5; pos.xy * rot(.8); float box2 box(pos,2. - abs(sin(gTime0.4))1.5); pos pos_origin; pos .x sin(gTime0.4)2.5; pos.xy * rot(.8); float box3 box(pos,2. - abs(sin(gTime0.4))1.5); pos pos_origin; pos .x -sin(gTime0.4)2.5; pos.xy * rot(.8); float box4 box(pos,2. - abs(sin(gTime0.4))1.5); pos pos_origin; pos.xy * rot(.8); float box5 box(pos,.5) * 6.; pos pos_origin; float box6 box(pos,.5) * 6.; float result max(max(max(max(max(box1,box2),box3),box4),box5),box6); return result; }float map(vec3 pos, float iTime) { vec3 pos_origin pos; float box_set1 box_set(pos, iTime);return box_set1; } void main() { vec2 p (gl_FragCoord.xy * 1. - iResolution.xy) / min(iResolution.x, iResolution.y); vec3 ro vec3(0., -0.2 ,iTime * 4.); vec3 ray normalize(vec3(p, 1.5)); ray.xy ray.xyrot(sin(iTime.03) * 5.); ray.yz ray.yzrot(sin(iTime.05) * .2); float t 0.1; vec3 col vec3(0.); float ac 0.0;for (int i 0; i 99; i){ vec3 pos ro ray * t; pos mod(pos-2., 4.) -2.; gTime iTime -float(i) * 0.01; float d map(pos, iTime);d max(abs(d), 0.01); ac exp(-d*23.);t d* 0.55; }col vec3(ac * 0.02);col vec3(0.,0.2abs(sin(iTime)),0.5 sin(iTime)0.2);gl_FragColor vec4(col ,1.0 - t(0.02 0.02sin (iTime))); }});let mesh new THREE.Mesh(geometry, material); scene.add(mesh);完整源码GitHub小结本文提供方块着色器完整 Three.js 源码与在线 Demo建议先运行案例再改 uniform/参数做二次实验更多 Three.js 实战案例见 three-cesium-examples 合集 与 GitHub 开源仓库

相关新闻

python findwindowex Python findwindowex抓不到窗格?这招让隐藏文本瞬间裸奔

python findwindowex Python findwindowex抓不到窗格?这招让隐藏文本瞬间裸奔

如下回复源自免费微信小程序: 皆我百晓生, 若问题被解决, 还望予以采纳, 要是依旧存有疑问, 可回复留言或者私信博主, 借此获取更为精准的帮助。 当中, 你能借助库去解析HTML文档还要提取其中的内容, 之后, 你可以凭借库把这些内容转化成格式, 以下是一个简单的例子: 首先, 你…

2026/7/9 0:43:35 阅读更多 →
全球首发 | 云克隆猫骨骼肌细胞(SkMC)原代细胞上线,为肌肉生理、代谢调控与疾病机制研究提供种属特异工具

全球首发 | 云克隆猫骨骼肌细胞(SkMC)原代细胞上线,为肌肉生理、代谢调控与疾病机制研究提供种属特异工具

骨骼肌约占全身重量的40%,是运动系统的主力。骨骼肌纤维呈长柱形、有明显横纹,由肌膜、肌浆和肌核三部分构成。它们不仅负责运动,还参与葡萄糖摄取、能量消耗和激素信号调控,是体内最大的代谢器官之一。研究骨骼肌的生长发育、损伤…

2026/7/9 0:41:35 阅读更多 →
工业负载控制方案:TPD2017FN与MKV44F128VLH16应用解析

工业负载控制方案:TPD2017FN与MKV44F128VLH16应用解析

1. 工业负载控制方案概述在工业自动化领域,TPD2017FN智能高边开关与MKV44F128VLH16微控制器的组合为电感和电阻负载控制提供了可靠解决方案。这种架构特别适用于需要精确控制继电器、电机、电磁阀等感性负载的场合,同时也能够有效管理加热元件等阻性负载…

2026/7/9 0:41:35 阅读更多 →

最新新闻

YOLOv8 数字仪表读数:180张数据集构建与 PyQt 界面读数结果实时显示

YOLOv8 数字仪表读数:180张数据集构建与 PyQt 界面读数结果实时显示

YOLOv8数字仪表读数识别:从数据集构建到PyQt界面开发的实战指南 在工业自动化和设备监测领域,数字仪表的自动读数一直是个既基础又关键的挑战。传统的人工记录方式不仅效率低下,还容易引入人为误差。而现代计算机视觉技术,特别是基…

2026/7/9 1:19:48 阅读更多 →
MemRef Dialect:内存引用与多维数组抽象

MemRef Dialect:内存引用与多维数组抽象

MemRef Dialect:内存引用与多维数组抽象 在控制流有了 SCF 支撑之后,数据在内存中的存储与访问便成为了下一个需要解决的核心问题。在底层编译中,直接操作扁平的一维指针(如 float*)会丢失大量的高维空间信息。为了在底…

2026/7/9 1:15:47 阅读更多 →
抗衰防病五道防线:从第一性原理导出的健康老龄化框架

抗衰防病五道防线:从第一性原理导出的健康老龄化框架

疾病不是突然发生的,而是生命能力储备沿着五道防线逐步失守的结果。本文从"生命是适应环境的能力集合体"这一第一性原理出发,结合衰老标志、表观遗传时钟、器官年龄、免疫衰老与代谢失衡等顶刊研究,推导出抗衰防病五道防线框架&…

2026/7/9 1:15:47 阅读更多 →
手机膜工艺对比:药水浸泡、电子束蒸发、磁控溅射AR有什么区别?

手机膜工艺对比:药水浸泡、电子束蒸发、磁控溅射AR有什么区别?

一、引言AR(Anti-Reflection)抗反射膜现在已经成为高端手机膜的标配,但是很多用户不知道,同样叫AR膜,不同工艺生产的产品,性能差距非常大,从几块钱的喷涂AR膜,到上百元的磁控溅射AR膜…

2026/7/9 1:13:46 阅读更多 →
DolphinDB质量实时监控:SPC统计过程控制

DolphinDB质量实时监控:SPC统计过程控制

目录 摘要一、SPC概述1.1 什么是SPC1.2 控制图类型1.3 控制限 二、数据准备2.1 质量数据表2.2 分布式存储 三、控制图计算3.1 X-bar R控制图3.2 P控制图 四、过程能力分析4.1 过程能力指数4.2 过程能力评价 五、异常检测5.1 控制图规则5.2 实时异常检测 六、质量告警6.1 SPC告警…

2026/7/9 1:11:46 阅读更多 →
围绕MonetaMarkets多端体验看,会更顺畅吗?

围绕MonetaMarkets多端体验看,会更顺畅吗?

围绕围绕多端体验看,会更顺畅吗这个角度再看MonetaMarkets,很多细节会比口号式描述更有参考价值。这种偏偏理性的处理方式,让正面评估更接近真实使用中的专业感。把问题拆开去看,平台在基础服务、说明完整度和提醒意识上的表现就更…

2026/7/9 1:11:46 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻