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

第五部分-后期特效与着色器——26. 着色器基础

26. 着色器基础1. 概述着色器Shader是在 GPU 上运行的小程序用于控制顶点位置和像素颜色。Three.js 允许通过 ShaderMaterial 编写自定义着色器实现高级视觉效果。┌─────────────────────────────────────────────────────────────┐ │ 着色器工作流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 顶点数据 ──► 顶点着色器 ──► 片元着色器 ──► 像素颜色 │ │ (Vertex) (Fragment) │ │ │ │ 顶点着色器处理顶点位置、法线、UV 等 │ │ 片元着色器处理每个像素的颜色、光照、纹理等 │ │ │ └─────────────────────────────────────────────────────────────┘2. 着色器类型2.1 顶点着色器Vertex Shader顶点着色器处理每个顶点的位置和属性。// 基础顶点着色器 void main() { // 计算顶点位置 vec4 mvPosition modelViewMatrix * vec4(position, 1.0); gl_PointSize 1.0; gl_Position projectionMatrix * mvPosition; }2.2 片元着色器Fragment Shader片元着色器处理每个像素的颜色。// 基础片元着色器 uniform vec3 color; void main() { gl_FragColor vec4(color, 1.0); }3. ShaderMaterial3.1 基本用法constvertexShadervarying vec2 vUv; void main() { vUv uv; vec4 mvPosition modelViewMatrix * vec4(position, 1.0); gl_PointSize 1.0; gl_Position projectionMatrix * mvPosition; };constfragmentShaderuniform vec3 uColor; varying vec2 vUv; void main() { gl_FragColor vec4(uColor, 1.0); };constmaterialnewTHREE.ShaderMaterial({uniforms:{uColor:{value:newTHREE.Color(0xff6600)}},vertexShader:vertexShader,fragmentShader:fragmentShader});3.2 ShaderMaterial 属性属性说明uniforms全局变量如时间、颜色vertexShader顶点着色器代码fragmentShader片元着色器代码transparent是否透明side渲染面wireframe线框模式4. UniformsUniforms 是着色器的全局变量可以在 JavaScript 中更新。constuniforms{uTime:{value:0},uColor:{value:newTHREE.Color(0xff6600)},uTexture:{value:texture},uResolution:{value:newTHREE.Vector2(800,600)}};// 更新 uniformfunctionanimate(){uniforms.uTime.value0.01;requestAnimationFrame(animate);}5. 内置变量5.1 顶点着色器内置变量变量类型说明positionvec3顶点位置局部坐标normalvec3顶点法线uvvec2UV 坐标modelViewMatrixmat4模型视图矩阵projectionMatrixmat4投影矩阵5.2 片元着色器内置变量变量类型说明gl_FragColorvec4输出颜色gl_FragCoordvec4片元屏幕坐标varying自定义从顶点着色器传递的数据6. Varying 变量Varying 变量用于在顶点着色器和片元着色器之间传递数据。// 顶点着色器 varying vec2 vUv; void main() { vUv uv; gl_Position projectionMatrix * modelViewMatrix * vec4(position, 1.0); } // 片元着色器 varying vec2 vUv; void main() { gl_FragColor vec4(vUv.x, vUv.y, 0.5, 1.0); }7. 完整示例import*asTHREEfromthree;import{OrbitControls}fromthree/examples/jsm/controls/OrbitControls.js;constscenenewTHREE.Scene();scene.backgroundnewTHREE.Color(0x000000);constcameranewTHREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);camera.position.set(2,2,3);camera.lookAt(0,0,0);constrenderernewTHREE.WebGLRenderer({antialias:true});renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(renderer.domElement);constcontrolsnewOrbitControls(camera,renderer.domElement);controls.enableDampingtrue;// 创建纹理constcanvasdocument.createElement(canvas);canvas.width512;canvas.height512;constctxcanvas.getContext(2d);ctx.fillStyle#ff6600;ctx.fillRect(0,0,canvas.width,canvas.height);ctx.fillStyle#ffffff;ctx.fontBold 40px Arial;ctx.fillText(Three.js,canvas.width/2-100,canvas.height/2);consttexturenewTHREE.CanvasTexture(canvas);// 顶点着色器constvertexShadervarying vec2 vUv; varying vec3 vPosition; void main() { vUv uv; vec4 mvPosition modelViewMatrix * vec4(position, 1.0); vPosition mvPosition.xyz; gl_PointSize 1.0; gl_Position projectionMatrix * mvPosition; };// 片元着色器constfragmentShaderuniform float uTime; uniform vec3 uColor; uniform sampler2D uTexture; varying vec2 vUv; varying vec3 vPosition; void main() { // 波浪效果 float wave sin(vUv.x * 20.0 uTime) * cos(vUv.y * 20.0 uTime) * 0.5 0.5; // 纹理采样 vec4 texColor texture2D(uTexture, vUv); // 渐变效果 vec3 gradient vec3(vUv.x, vUv.y, 0.5); // 颜色混合 vec3 finalColor mix(uColor, texColor.rgb, 0.5); finalColor mix(finalColor, gradient, 0.3); finalColor vec3(wave * 0.3); // 边缘暗角 float vignette 1.0 - length(vUv - 0.5) * 0.8; finalColor * vignette; gl_FragColor vec4(finalColor, 1.0); };// 创建材质constuniforms{uTime:{value:0},uColor:{value:newTHREE.Color(0xff6600)},uTexture:{value:texture}};constmaterialnewTHREE.ShaderMaterial({uniforms:uniforms,vertexShader:vertexShader,fragmentShader:fragmentShader,side:THREE.DoubleSide});// 创建几何体constgeometrynewTHREE.SphereGeometry(1,64,64);constmeshnewTHREE.Mesh(geometry,material);scene.add(mesh);// GUI 控制importGUIfromlil-gui;constguinewGUI();gui.add(uniforms.uColor.value,r,0,1).name(红色).onChange(()uniforms.uColor.value.setHSL(uniforms.uColor.value.r,1,0.5));gui.add(uniforms.uColor.value,g,0,1).name(绿色);gui.add(uniforms.uColor.value,b,0,1).name(蓝色);// 动画functionanimate(){requestAnimationFrame(animate);uniforms.uTime.value0.01;mesh.rotation.y0.005;controls.update();renderer.render(scene,camera);}animate();window.addEventListener(resize,onWindowResize,false);functiononWindowResize(){camera.aspectwindow.innerWidth/window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth,window.innerHeight);}8. 常见效果示例8.1 波浪效果float wave sin(position.y * 5.0 uTime) * 0.1; vec3 newPosition position vec3(0.0, wave, 0.0);8.2 颜色渐变vec3 color1 vec3(1.0, 0.0, 0.0); vec3 color2 vec3(0.0, 0.0, 1.0); vec3 finalColor mix(color1, color2, vUv.x);8.3 溶解效果float dissolve texture2D(uNoiseTexture, vUv).r; if (dissolve uProgress) discard;9. 总结类型用途顶点着色器处理顶点位置片元着色器处理像素颜色Uniforms全局变量Varying顶点→片元传递ShaderMaterial自定义材质内置变量说明position顶点位置uvUV 坐标normal法线modelViewMatrix模型视图矩阵projectionMatrix投影矩阵

相关文章:

第五部分-后期特效与着色器——26. 着色器基础

26. 着色器基础 1. 概述 着色器(Shader)是在 GPU 上运行的小程序,用于控制顶点位置和像素颜色。Three.js 允许通过 ShaderMaterial 编写自定义着色器,实现高级视觉效果。 ┌──────────────────────────…...

Spring Cloud + Dubbo + RocketMQ 三端协同适配实战(中间件灰度验证SOP首次公开)

更多请点击: https://intelliparadigm.com 第一章:Spring Cloud Dubbo RocketMQ 三端协同适配测试概述 在微服务架构深度演进的当下,混合技术栈已成为企业级系统集成的常态实践。Spring Cloud 提供统一的服务治理与配置能力,Du…...

Vector API从入门到生产落地,8大典型场景代码模板+编译器逃逸分析技巧,错过再等5年

更多请点击: https://intelliparadigm.com 第一章:Vector API从入门到生产落地,8大典型场景代码模板编译器逃逸分析技巧,错过再等5年 Java 16 引入的 Vector API(JEP 338)在 JDK 19–21 中持续演进&#x…...

Python类型配置最后的黄金窗口期:CPython 3.13即将强制增强类型元数据,错过将影响未来5年架构演进

更多请点击: https://intelliparadigm.com 第一章:Python类型配置的战略意义与时代背景 在现代软件工程演进中,Python 类型配置已从可选辅助机制跃升为系统可靠性、团队协作效率与长期可维护性的核心基础设施。随着大型项目(如Py…...

Python微调优化已进入“毫秒级决策”时代:2024最新FlashAttention-3 + QLoRA动态调度实战

更多请点击: https://intelliparadigm.com 第一章:Python微调优化的范式跃迁 传统Python模型微调依赖手动调整学习率、批次大小与早停策略,而新一代范式正转向基于梯度轨迹分析、参数高效适配(PEFT)与自动超参编排的…...

可微光栅化技术:3D场景重建与实时渲染新突破

1. 可微三角形光栅化技术解析1.1 传统光栅化的局限性传统图形管线中的光栅化过程是一个离散化操作,它将连续的几何形状转换为离散的像素阵列。这个过程中最关键的步骤是将三角形从3D空间投影到2D屏幕空间,并确定哪些像素被三角形覆盖。然而,这…...

Pearcleaner:如何彻底清理macOS应用残留文件的终极指南

Pearcleaner:如何彻底清理macOS应用残留文件的终极指南 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经将应用拖入废纸篓后&#xff0…...

Monopoly Deal博弈论分析:有界单向响应策略

1. 项目背景与核心概念解析Monopoly Deal作为经典桌游《大富翁》的卡牌版本,其游戏机制中蕴含着丰富的博弈论原理。这个项目研究的"有界单向响应游戏动态",实际上探讨的是在固定规则框架下(有界性),玩家只能…...

MedCLIPSeg:基于CLIP的医学图像小样本分割技术

1. 项目概述MedCLIPSeg是一种创新的医学图像分割方法,它通过结合CLIP(Contrastive Language-Image Pretraining)模型的强大视觉-语言对齐能力和分割网络的精确性,实现了在有限标注数据下的高效医学图像分割。这种方法特别适合医学…...

50.YOLOv8 工业级全流程实战(CUDA118):训练 + 推理 + ONNX 导出 + TensorRT 加速 + Flask 部署,全套可复制源码 + 避坑指南

摘要 YOLO(You Only Look Once)系列算法是目标检测领域里程碑式的模型,以端到端、单阶段、高实时性著称。本文从YOLOv8的核心原理出发,覆盖数据准备、模型训练、评估、推理、ONNX导出、TensorRT加速及Flask部署全链路。全程提供可运行的完整代码,所有代码均经过严格测试。…...

终极星露谷物语模组合集指南:15个必备SMAPI模组提升游戏体验

终极星露谷物语模组合集指南:15个必备SMAPI模组提升游戏体验 【免费下载链接】StardewMods Mods for Stardew Valley using SMAPI. 项目地址: https://gitcode.com/gh_mirrors/st/StardewMods 还在为《星露谷物语》中繁琐的农场管理而烦恼吗?想要…...

从认知架构到自主智能体:Cogito项目与AI思考系统构建指南

1. 项目概述:一个关于“认知”的AI探索最近在GitHub上看到一个挺有意思的项目,叫“Phazorknight/Cogito”。光看这个名字,就有点哲学味儿——“Cogito”源自笛卡尔那句著名的“我思故我在”(Cogito, ergo sum)。这让我…...

RAGFlow 系列教程 第十课:LLM 抽象层 -- 统一模型接口

系列: RAGFlow v0.25.0 源码深度解析 作者: 耿雨飞 前置知识: 已完成第九课"文档解析器层 – 多模态文档处理实战"的学习 导读 在前面的课程中,我们多次看到 RAGFlow 调用各种大模型完成任务:VLM 做图像理解、Embedding 模型做向量化、Rerank 模型做结果重排序、C…...

当理想撞上现实:我是如何用‘断臂求生’策略,拆分硬件创业团队并重启项目的

当理想撞上现实:硬件创业团队的“断臂求生”与战略重启 深夜的办公室里,咖啡杯旁散落着第七版电路设计图纸。作为连续创业者,我盯着屏幕上跳动的财务数据,突然意识到一个残酷事实:我们的硬件创业项目正在被自己设计的完…...

PDPS镜像对象保姆级教程:从单个零件到整站布局,5分钟搞定对称模型

PDPS镜像对象高效应用指南:从零件复制到整站布局的实战技巧 在工业仿真领域,对称结构的设计与验证往往占据大量工作时间。想象一下这样的场景:您刚完成一条自动化产线左侧布局,现在需要创建完全对称的右侧部分;或者设计…...

xClaude-Plugin:模块化iOS开发自动化插件,提升AI编程效率

1. 项目概述:xClaude-Plugin,一个为Claude Code设计的模块化iOS开发自动化插件如果你是一名iOS开发者,并且正在使用Claude Code作为你的AI编程伙伴,那么你很可能已经体会过那种“隔靴搔痒”的无力感。你告诉Claude:“帮…...

告别‘夜盲症’:手把手教你用PyTorch复现SID数据集上的UNet低光增强模型

告别‘夜盲症’:手把手教你用PyTorch复现SID数据集上的UNet低光增强模型 深夜的城市街道、昏暗的室内场景、月光下的自然景观——这些低光照环境下的图像往往充满噪点和模糊,让细节消失在一片混沌中。传统相机通过提高ISO或延长曝光时间来应对&#xff0…...

LwIP内存池(memp.c)设计精妙在哪?从‘挖坑占位’到链表操作,一个简化版C程序全讲透

LwIP内存池核心机制解析:从静态数组到动态链表的精妙设计 在嵌入式网络协议栈开发中,内存管理一直是决定系统性能和稳定性的关键因素。LwIP作为轻量级TCP/IP协议栈的经典实现,其内存池(memp.c)设计尤其值得深入剖析。本文将用一个完整可运行的…...

从JVM内存模型出发,图解Java static关键字的加载时机与使用陷阱

从JVM内存模型出发,图解Java static关键字的加载时机与使用陷阱 在Java开发中,static关键字看似简单,却隐藏着许多值得深入探讨的底层机制。很多开发者虽然能熟练使用static修饰变量和方法,但当被问到"静态变量究竟存储在JVM…...

保姆级教程:手把手教你为Amlogic盒子(Android 14)适配第三方红外遥控器,从抓码到生效

保姆级教程:Amlogic盒子红外遥控器适配全流程实战 手里拿着第三方红外遥控器却无法操控Amlogic电视盒子?这种体验就像拥有法拉利钥匙却打不开车门。本文将带你深入Android 14系统底层,从红外信号捕获到系统级按键映射,彻底解决遥控…...

互联网与机器学习:不必强求,却能出色运行!

计算复杂度分享 兰斯福诺(Lance Fortnow)和比尔加萨尔(Bill Gasarch)分享计算复杂度以及数学和计算机科学中其他有趣内容。 2026 年 4 月 29 日观点 最喜欢的关于网络的一句话来自吉姆库罗斯(Jim Kurose)&a…...

初探 Erlang 第二部分:解锁单赋值、模式匹配等基础概念!

单赋值与模式匹配在 Erlang 里,需从数学意义理解变量,一旦绑定就不能更改值。 运算符进行模式匹配,可从复杂结构提取数据。还能控制程序流程、写出简洁代码。守卫守卫是模式匹配的额外约束,可用于函数头部、case 和 if 语句&#…...

挂在“碳排放”?2026 英澳欧秋招隐藏红线:绿色软件工程降维打击指南

想象一下这个残酷的场景:你在伦敦或悉尼的精美写字楼里,顶着时差和压力,终于完美手撕了最后一道算法题。面试官微笑着点点头,突然抛出一个问题:“如果要把这段代码部署到线上,你打算如何降低它的碳排放&…...

几百万学费换来的顶级 CS 学位,为何在 2026 年秋招“失灵”了?

最近接触了不少深陷“求职无力感”的留学生家庭。 家长耗资百万供孩子读完北美名校,本以为拿到了一张通往高薪大厂的 VIP 门票。 结果孩子拿着满分通过的 Java 和 C 成绩单去面试,却被面试官一句“讲讲你的大模型微调落地经验”问得哑口无言。 这不是留学…...

管理多人团队的API Key权限与审计日志最佳实践

管理多人团队的API Key权限与审计日志最佳实践 1. 团队密钥管理的基本场景 在企业或多人协作环境中,不同项目组往往需要共享同一个Taotoken平台账号,但直接共享主账号的API Key会带来一系列管理难题。典型问题包括无法区分各团队的调用来源、难以控制单…...

DeepSeek-V4:AI终于学会“偷懒”了?这波升级直接把效率拉满

这一次,DeepSeek-V4将前四代的技术精华融为一体,通过CSA和HCA等机制,把‘压缩’和‘挑重点’的艺术玩到了极致,从而原生支持百万级的上下文处理。你有没有过这种经历: 把一本几百页的行业报告丢给 AI,结果它…...

RAG 系列(五):Embedding 模型——语义理解的核心

为什么换个 Embedding 模型,检索效果天差地别? 前面四篇文章,我们搞定了 Pipeline 搭建、参数调优和分块策略。但有一个问题一直没细说: 你的文档被切成 Chunk 之后,是怎么变成向量的? 这个过程叫 Embeddi…...

物理引导的视频生成技术PhyGDPO解析

1. 项目背景与核心价值视频生成领域正在经历从"能看"到"能用"的关键转折。传统文本到视频(Text-to-Video)技术虽然能根据文字描述生成动态画面,但物理合理性始终是行业痛点——水流倒灌、物体违反重力规律、肢体运动失调…...

FHIR接口对接总失败,配置错在哪?,深度解析Python医疗配置中4类YAML/JSON隐性语法雷区

更多请点击: https://intelliparadigm.com 第一章:FHIR接口对接失败的典型现象与归因框架 FHIR(Fast Healthcare Interoperability Resources)接口在医疗系统集成中频繁出现对接失败,其表象虽具多样性,但背…...

你的NDVI计算结果偏移±0.15?——基于IEEE TGRS 2024最新基准测试的浮点精度链路审计(含numpy.seterr全栈捕获模板)

更多请点击: https://intelliparadigm.com 第一章:你的NDVI计算结果偏移0.15?——基于IEEE TGRS 2024最新基准测试的浮点精度链路审计(含numpy.seterr全栈捕获模板) IEEE TGRS 2024发布的《Floating-Point Sensitivit…...