从零开始学习three.js(18):一文详解three.js中的着色器Shader
在WebGL和Three.js的3D图形渲染中,着色器(Shader) 是实现复杂视觉效果的核心工具。通过编写自定义的着色器代码,开发者可以直接操作GPU,实现从基础颜色渲染到动态光照、粒子效果等高级图形技术。本文将深入解析Three.js中着色器的核心概念、实现原理及实战应用,并结合代码示例帮助读者全面掌握这一关键技术。
核心特点:
一、着色器基础与分类
1.1 顶点着色器(Vertex Shader)
顶点着色器负责处理几何体的每个顶点,主要功能包括:
- 顶点位置变换:将模型空间坐标转换为屏幕空间坐标(通过
gl_Position
输出) - 顶点属性计算:如法线变换、纹理坐标传递等
void main() {gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
说明:projectionMatrix
(投影矩阵)、modelViewMatrix
(模型视图矩阵)由Three.js自动注入,position
是顶点的原始坐标。
1.2 片元着色器(Fragment Shader)
片元着色器决定每个像素的最终颜色,通过 gl_FragColor
输出:
void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色
}
特性:颜色支持动态计算,如基于光照模型、纹理采样等。
1.3 着色器材质类型
Three.js提供两种自定义着色器材质:
-
ShaderMaterial
:简化版材质,内置常用变量(如modelViewMatrix
、projectionMatrix
),适合快速开发。 -
RawShaderMaterial
:需手动声明所有变量(如attribute
、uniform
),灵活性更高,适合深度优化。
示例代码:创建基础着色器材质
const material = new THREE.ShaderMaterial({ vertexShader: vertexShaderCode, fragmentShader: fragmentShaderCode, uniforms: { time: { value: 0 }, color: { value: new THREE.Color(0xff0000) } }
});
二、着色器变量类型
2.1 Uniforms
- 全局常量:所有顶点/片元共享同一值(如时间、光源位置)
- 传递方式:通过
ShaderMaterial
的uniforms
属性设置
const material = new THREE.ShaderMaterial({uniforms: {uTime: { value: 0 },uTexture: { value: new THREE.TextureLoader().load("texture.png") }}
});
在着色器中声明:uniform float uTime;
2.2 Attributes
- 顶点属性:每个顶点独有的数据(如位置、颜色、法线)
- 典型应用:动态顶点动画(如波浪效果)
geometry.setAttribute('displacement', new THREE.BufferAttribute(displacementArray, 1));
在顶点着色器中访问:attribute float displacement;
2.3 Varyings
- 插值变量:从顶点着色器向片元着色器传递数据(如UV坐标、颜色插值)
// 顶点着色器
varying vec2 vUv;
void main() {vUv = uv;// ...
}// 片元着色器
varying vec2 vUv;
void main() {vec4 color = texture2D(uTexture, vUv);
}
注意:变量名需在两者中保持一致。
三、矩阵变换与坐标系统
3.1 核心矩阵解析
- 模型矩阵(modelMatrix) :几何体的旋转、平移、缩放变换
- 视图矩阵(viewMatrix) :相机的观察变换(等同于相机世界矩阵的逆矩阵)
- 投影矩阵(projectionMatrix) :3D到2D的投影(如透视投影)
3.2 矩阵乘法顺序
顶点变换遵循 “右乘”顺序,确保坐标正确转换:
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);
原理:从模型空间→世界空间→相机空间→裁剪空间逐步变换。
四、实战案例:动态波纹效果
4.1 着色器代码实现
顶点着色器(传递UV坐标):
varying vec2 vUv;
void main() {vUv = uv;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
片元着色器(动态波纹计算):
uniform float uTime;
varying vec2 vUv;void main() {float ripple = sin(length(vUv - 0.5) * 10.0 - uTime * 2.0);float opacity = smoothstep(0.0, 0.2, abs(ripple));gl_FragColor = vec4(0.2, 0.5, 1.0, opacity);
}
4.2 JavaScript端配置
const material = new THREE.ShaderMaterial({uniforms: {uTime: { value: 0 }},vertexShader: vertexShaderCode,fragmentShader: fragmentShaderCode,transparent: true
});// 动画循环中更新Uniform
function animate() {material.uniforms.uTime.value += 0.01;requestAnimationFrame(animate);
}
效果:实现以中心向外扩散的蓝色波纹。
五、高级技巧与优化
5.1 性能优化策略
- 减少分支语句:GPU不擅长动态分支,可用
mix()
或step()
替代if-else
- 向量化运算:优先使用
vec3
/vec4
代替多个float
计算 - 纹理压缩:使用Mipmap和纹理图集减少采样开销
5.2 常见问题排查
- 变量未声明:检查Three.js版本是否支持特定语法(如
#version 300 es
) - 精度问题:在移动端明确指定精度(
precision mediump float;
) - 矩阵顺序错误:确保模型→视图→投影的乘法顺序正确
六、扩展应用:后期处理通道
通过 EffectComposer
和 ShaderPass
实现屏幕后处理:
import { EffectComposer, ShaderPass } from 'three/examples/jsm/postprocessing';const composer = new EffectComposer(renderer);
composer.addPass(new RenderPass(scene, camera));const customPass = new ShaderPass(customShaderMaterial);
composer.addPass(customPass);
典型效果:模糊、Bloom光效、颜色校正等。
结语
Three.js着色器为开发者打开了高性能图形编程的大门。通过深入理解GLSL语法、矩阵变换和变量传递机制,可以创造出从基础颜色变化到复杂物理模拟的全方位视觉效果。建议通过Shadertoy平台进行实时演练,结合Three.js文档探索更多可能性。
相关文章:
从零开始学习three.js(18):一文详解three.js中的着色器Shader
在WebGL和Three.js的3D图形渲染中,着色器(Shader) 是实现复杂视觉效果的核心工具。通过编写自定义的着色器代码,开发者可以直接操作GPU,实现从基础颜色渲染到动态光照、粒子效果等高级图形技术。本文将深入解析Three.j…...
Trae - 国人Cursor的免费平替产品
前情提要:Cursor-零基础使用flutter完成贪吃蛇游戏-迄今为止世上最牛的AI编辑工具,不需要程序员也可以编程 Cursor 不是我的最佳选择 Cursor 是基于 VSCode 进化而来,虽然好用,但总结下来有几点点是我有所顾虑的。 第一&#x…...
【PmHub后端篇】PmHub中Seata分布式事务保障任务审批状态一致性
在分布式系统中,事务管理是保证数据一致性的关键。本文将深入探讨在PmHub系统中,如何利用Seata分布式事务来保证任务审批状态的一致性。分布式事务在面试中是常见的考点,网上教程多偏理论,而实际项目中的应用更为关键。 1 事务基…...
2025年长三角高校数模竞赛B题Q1-Q3详细求解与Q4详细分析
B题 空气源热泵供暖的温度预测 问题背景 空气源热泵是一种与中央空调类似的设备,其结构主要由压缩主机、热交换 器以及末端构成,依靠水泵对末端房屋提供热量来实现制热。空气源热泵作为热 惯性负载,调节潜力巨大。工作时通过水循环系统将…...
插槽(Slot)的使用方法
插槽是Vue.js中一个强大的功能,允许你在组件中预留位置,让父组件可以插入自定义内容。以下是插槽的主要使用方法: 基本插槽 <!-- 子组件 ChildComponent.vue --> <template><div><h2>子组件标题</h2><slo…...
Milvus Docker 部署教程
1. 环境准备 确保您的系统已安装: DockerDocker ComposePython (用于运行客户端代码) 2. 项目结构 创建项目目录并设置以下文件: milvus-docker/ ├── docker-compose.yml ├── main.py3. 配置文件 docker-compose.yml version: 3.5services:…...
Vue 3 中 watch 的使用与深入理解
在 Vue 3 的 Composition API 中,watch 是一个非常强大的工具,用于监听响应式数据的变化并做出相应的处理。本文将通过一段实际代码来深入解析 watch 的行为和使用技巧。 🧩 示例代码回顾 import { reactive, watch } from vueconst state …...
嵌入式学习笔记 D21:双向链表的基本操作
双向链表的定义与创建双向链表的插入双向链表的查找双向链表的修改双向链表的删除双向链表的逆序MakeFile工具使用 一、双向链表的定义与创建 1.双向链表的定义: 双向链表是在单链表的每个结点中,再设置一个指向其前一个结点的指针域。 struct DOUNode…...
pciutils-3.5.5-win64工具的使用方法
目录 简介: 方法一:使用设备管理器 方法二:pciutils-3.5.5-win64 简介: window系统下查看PCIe设备信息比较困难 linux版本下,查看PCIE的信息比较容易,可在安装插件后直接使用命令得出。 例如…...
全息美AISEO引领AIGEO新趋势
内容概要 在数字化营销变革的浪潮中,全息美AISEO为企业注入了全新的活力。通过结合先进的技术与创造性的策略,AISEO不仅提升了品牌的可见度,更通过精准的用户定位,实现了信息的高效传播。尤其在当下竞争日益激烈的市场环境中&…...
平滑过滤值策略
该策略是一种基于技术分析的交易策略,主要通过计算一系列指标来判断市场趋势,并根据这些指标生成交易信号。 策略概述 该策略的核心在于利用多个技术指标来分析市场动态,并据此制定交易决策。它结合了价格动量、波动性和趋势跟踪等多种因素,旨在提高交易的准确性和效率。…...
Windows平台OpenManus部署及WebUI远程访问实现
前言:继DeepSeek引发行业震动后,Monica.im团队最新推出的Manus AI 产品正席卷科技圈。这款具备自主思维能力的全能型AI代理,不仅能精准解析复杂指令并直接产出成果,更颠覆了传统人机交互模式。尽管目前仍处于封闭测试阶段…...
极验证Geetest 通过python代理 透传
看了几个破解Geetest 四代滑块的视频和文章,有点望而生畏,github上也有收集极验四代滑块所有图片后经过ai训练做的破解代码,但作者说成功率只有90%。 于是考虑通过python透传的方法,j就是对自动化脚本套个【网页界面】的壳&#…...
JDK 1.8 全解析:从核心特性到企业实战的深度实践
引言 JDK 1.8 作为 Java 生态发展史上的里程碑版本,自 2014 年发布以来,凭借 Lambda 表达式、Stream API、新日期时间 API 三大核心特性,彻底重塑了 Java 编程范式。本文结合 Oracle 官方文档、蚂蚁集团、京东零售等企业级实战案例ÿ…...
OptiStruct实例:汽车声控建模
本章通过一个Tim-BaDy模型,展示利用AemmiecaviyMet工具进行声腔网格划分的过程因为南腔是考康边界的声场,所以在开展腔建机之的N营涉设物建大致封闭的边界模器东有内商院建权为例,首先需要准备自车身所合之的、首先委部)结构的有限元型车内声…...
k8s(12) — 版本控制和滚动更新(金丝雀部署理念)
金丝雀部署简介: 1、基本概念 金丝雀部署是一种软件开发中的渐进式发布策略,其核心思想是通过将新版本应用逐步发布给一小部分用户(即 “金丝雀” 用户),在真实环境中验证功能稳定性和性能表现,再逐步扩大发…...
基于matlab实现AUTOSAR软件开发---答疑6
最近有少朋友在咨询我关于模型生成A2L文件,之后在把elf文件的地址提取进去,生成最终的A2L的操作,这个其实可以看下mathwork的帮助文档,地址如下: https://www.mathworks.com/help/ecoder/ug/asap2-cdf-calibration.htmlhttps://www.mathworks.com/help/ecoder/ug/asap2-c…...
铜墙铁壁 - 服务网格的安全之道 (Istio 实例)
铜墙铁壁 - 服务网格的安全之道 (Istio 实例) 在微服务架构中,服务间的通信是频繁且复杂的。传统的安全模型常常假设内部网络是可信的,这在现代分布式系统和云原生(尤其是零信任)环境中是远远不够的。我们需要解决几个核心安全问题: 通信加密 (Encryption):如何确保服务 …...
计量——检验与代理变量
1.非嵌套模型的检验 1Davidson-Mackinnon test 判断哪个模型好 log(y)β0β1x1β2x2β3x3u log(y)β0β1log(x1)β2log(x2)β3log(x3)u 1.对logÿ…...
【C++】解析C++面向对象三要素:封装、继承与多态实现机制
解析C面向对象三要素:封装、继承与多态实现机制 1. 面向对象设计基石2. 封装:数据守卫者2.1 访问控制实现2.2 封装优势 3. 继承:代码复用艺术3.1 继承的核心作用3.2 继承类型对比3.3 典型应用场景3.4 构造函数与析构函数处理3.4.1 构造顺序控…...
c语言 写一个五子棋
c语言 IsWin判赢 display 画棋盘 判断落子的坐标是否已有棋子 判断落子坐标范围是否超出范围 // 五子棋 #include <stdio.h> #include <stdlib.h>// 画棋盘 void display(char map[][10]) {system("clear");printf(" 0 1 2 3 4 5 6 7 8 9\n&…...
深度解析 IDEA 集成 Continue 插件:提升开发效率的全流程指南
一、插件核心功能与应用场景 Continue 是一款专为 JetBrains IDE 设计的 AI 编程助手插件,基于大语言模型实现以下核心功能: 智能代码生成:支持根据自然语言描述生成完整方法、单元测试或设计模式(如线程安全单例模式࿰…...
Node.js
本文来源 : 腾讯元宝 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,采用 事件驱动 和 非阻塞 I/O 模型,专为构建高性能、可扩展的网络应用而设计。以下是其核心特性和应用场景的总结: 1…...
idea经常卡顿解决办法
一:前言 (1)使用idea工具开发过久,出现卡顿,等待响应 二:原因 (1)给idea设置的运行内存过小,需要使用的内存超过设置的内存 (2)插件过多&…...
【python】字典:: a list of dictionaries
No, actions is not a dictionary. It’s a list of dictionaries. Each item in the list is a dictionary with three key-value pairs: “measure” (number), “resource” (string), and “reason” (string). Here’s the structure: actions is a list []Each element…...
高效电脑隐私信息清理实用工具
软件介绍 本文介绍的这款Privacy Eraser,它是一款电脑系统隐私清理工具。 功能介绍 这款工具能够清理电脑里的多种信息,比如最近文件、临时文件、注册表信息,还有浏览器插件以及日志文件等等。 引导提示 注重隐私保护的小伙伴一定要将这款…...
在ubuntu系统中将vue3的打包文件dist 部署nginx 并且配置ssl证书 以https方式访问
在ubuntu系统中将vue3的打包文件dist 部署nginx 并且配置ssl证书 以https方式访问 确保 Nginx 已安装准备 Vue 3 打包文件配置 Nginx编辑 Nginx 配置文件启用配置文件测试 Nginx 配置重新加载 Nginx配置 SSL 证书获取 SSL 证书验证证书自动续期验证部署注意事项 确保 Nginx 已安…...
MH22D3开发高级UI应用,适配arm2d驱动
在资源有限的嵌入系统上,要开发出具有现代风格(圆弧,表盘,滚动,滑动,透明,图层叠加等)的UI应用,需要极高的cpu算力和ram,flash资源的支持。 但是往往鱼和熊掌…...
MongoDB数据库深度解析:架构、特性与应用场景
在现代应用程序开发中,数据存储技术的选择至关重要。在众多的数据库管理系统中,MongoDB以其灵活性和强大的功能迅速崛起,成为NoSQL数据库中的佼佼者。本文将深入解析MongoDB的架构、核心特性、性能优化及其在实际应用中的最佳实践,…...
LeetCode 235. 二叉搜索树的最近公共祖先 LeetCode 701.二叉搜索树中的插入操作 LeetCode 450.删除二叉搜索树中的节点
LeetCode 235. 二叉搜索树的最近公共祖先 思路: 根据二叉搜索树的特性,对 “基于二叉树的最近公共祖先 ” 进行优化,在二叉树寻找最近公共祖先时,需要分别对根节点的两个子树进行遍历来判断两个节点是异侧还是同侧。但是在二叉搜…...
GPU异步执行漏洞攻防实战:从CUDA Stream竞争到安全编程规范
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 引言 在高校实验室的GPU加速计算研究中,多卡并行编程已成为提升深度学习训练效…...
[c语言日寄]数据结构:栈
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
day21:零基础学嵌入式之数据结构
一、双向链表(doulinklist) 1. 2.创建 struct DouLinkList *CreateDouLinkList() {struct DouLinkList *dl malloc(sizeof(struct DouLinkList));if(NULL dl){fprintf(stderr, "CreateDouLinkLis malloc");return NULL;}dl->head NUL…...
数据结构之图的应用场景及其代码
一,最小生成树 最小生成树(Minimum Spanning Tree, MST)是图论中的经典问题,旨在通过选择无向连通图中的边,使得所有节点连通且总边权最小。 1.1 普里姆(Prim)算法 普里姆算法是一种用于求解…...
python克洛伊婚纱摄影预约管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
GCC 使用说明
参数 -fPIC ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so -fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加…...
配置别名路径 @
CRA本身把webpack配置包装到了黑盒里无法直接修改,需要借助一个插件 - craco 1. 路径解析配置(Webpack)-- craco 插件 把 / 解析为 src/ 配置步骤: 1.安装 craco npm i -D craco/craco 2. 项目根目录下创建配置文件 craco.co…...
MYSQL基本命令
目录 1.登录命令2.操作数据库命令2.1查询数据库(show)2.2 创建数据库(create)2.3使用数据库(use) 3.操作表命令3.1增加表3.2查询表3.3修改表(alert)3.4 删除(delete/drop) 1.登录命令 mysql -uroot -p2.操作数据库命令 2.1查询数据库(show) show databases;2.2 创建数据库(c…...
C#语法基础
一、什么是.NET平台 .NET 是由 Microsoft 支持的免费开放源代码应用程序平台。 .NET .NET 是一个安全、可靠且高性能的应用程序平台。C# 是 .NET 的编程语言。它是强类型且类型安全的,并集成了并发和自动内存管理。 C# C# 是一种新式、安全且面向对象的编程语言&…...
深度学习框架对比---Pytorch和TensorFlow
一、计算图与执行模式 1. 图的本质:动态图 vs 静态图 PyTorch(动态图,Eager Execution) 运行机制:代码逐行执行,张量操作立即生效,计算图在运行时动态构建。x torch.tensor(1.0, requires_gra…...
antdv3 Tabs.TabPane 右上角增加一个角标Badge
1、Tabs官方说明 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、Badge角标官方效果图 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 3、Tabs.TabPane要实现的效果 4、代码 <Tabs v-m…...
Python-88:英雄升级奖励
问题描述 在一个游戏中,小W拥有 n 个英雄,每个英雄的初始能力值均为 1。她可以通过升级操作来提升英雄的能力值,最多可以进行 k 次升级。 每次升级操作包含以下步骤: 选择一个英雄选择一个正整数 x将该英雄的能力值 aiai 更新…...
使用uv创建python项目
uv创建项目 uv init -p 3.12 qwen3env # -p 指定python版本 # qwen3env是项目名称 # 可以使用下面的步骤 mkdir qwen3env cd qwen3env uv venv -p3.12 .venv # 基于 Python 3.12 创建名为 .venv 的虚拟环境 uv init第一种方式 第二种方式 内容如下 执行python脚本 uv ru…...
window 显示驱动开发-命令和 DMA 缓冲区简介
命令和 DMA 缓冲区非常相似。 但是,命令缓冲区由用户模式显示驱动程序使用,DMA 缓冲区由显示微型端口驱动程序使用。 命令缓冲区具有以下特征: 它永远不会由 GPU 直接访问。 硬件供应商控制格式。 它从呈现应用程序的专用地址空间中的常规…...
深光-谷歌TV TADA/奈飞Netflix/亚马逊Prime Video/YouTube等测试外包服务
一、谷歌TV TADA测试服务 1.CTS CTS测试是一系列旨在确保设备与Android操作系统兼容性的自动化测试,CTS是所有测试项中测试量最大的一项测试。 2.GTS GTS测试是确保Android设备能够正确集成和运行Google Mobile Services(GMS)的关键步骤&am…...
《教育退费那些事儿:从困境到破局》
《教育退费那些事儿:从困境到破局》 教育退费:不容忽视的热点问题 在当今社会,教育消费已成为家庭支出的重要组成部分。无论是 K12 阶段的学科辅导、艺术特长培训,还是成人的职业技能提升、学历继续教育,家长和学生们…...
AtCoder 第405场初级竞赛 A~E题解
A Is it rated? 【题目链接】 原题链接:A - Is it rated? 【考点】 嵌套判断 【题目大意】 有两个分区,有不同的评分区间,给一个评分 r 和分区 x,判断是否在评分区间中。 【解析】 先判断在属于哪个分区,再判断是否在该分区评分区间中。 【难度】 GESP一级 【…...
登录接口中图片验证码Tesseract-OCR识别Java脚本
项目上移植了研发部的产品,文档不全,项目上验证码功能无法关闭,又要做接口/性能测试,开发不配合(作为测试多么无奈),此方法识别命中率不高,仅作借鉴。 版本JDK11 import io.restass…...
专项智能练习(定义判断)_DA_02
2. 单选题 虚假同感偏差也叫虚假一致性偏差,是指人们常常会高估或夸大自己的信念、判断及行为的普遍性。在认知他人时总喜欢把自己的特性赋予他人身上,假定他人与自己是相同的,而当遇到与此相冲突的信息时,会坚信自己信念和判断的…...
安卓A15系统实现修改锁屏界面默认壁纸功能
最近遇到一个A15系统项目,客户要求修改锁屏界面的默认壁纸,客户提供了一张壁纸图片,但是从A15系统的源代码查看时才知道谷歌已经去掉了相关的代码,已经不支持了,A13和A14系统好像是支持的,A15系统的Wallpap…...