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

第五部分-后期特效与着色器——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. ShaderMaterial

3.1 基本用法

constvertexShader=`varying vec2 vUv; void main() { vUv = uv; vec4 mvPosition = modelViewMatrix * vec4(position, 1.0); gl_PointSize = 1.0; gl_Position = projectionMatrix * mvPosition; }`;constfragmentShader=`uniform vec3 uColor; varying vec2 vUv; void main() { gl_FragColor = vec4(uColor, 1.0); }`;constmaterial=newTHREE.ShaderMaterial({uniforms:{uColor:{value:newTHREE.Color(0xff6600)}},vertexShader:vertexShader,fragmentShader:fragmentShader});

3.2 ShaderMaterial 属性

属性说明
uniforms全局变量(如时间、颜色)
vertexShader顶点着色器代码
fragmentShader片元着色器代码
transparent是否透明
side渲染面
wireframe线框模式

4. Uniforms

Uniforms 是着色器的全局变量,可以在 JavaScript 中更新。

constuniforms={uTime:{value:0},uColor:{value:newTHREE.Color(0xff6600)},uTexture:{value:texture},uResolution:{value:newTHREE.Vector2(800,600)}};// 更新 uniformfunctionanimate(){uniforms.uTime.value+=0.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*asTHREEfrom'three';import{OrbitControls}from'three/examples/jsm/controls/OrbitControls.js';constscene=newTHREE.Scene();scene.background=newTHREE.Color(0x000000);constcamera=newTHREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);camera.position.set(2,2,3);camera.lookAt(0,0,0);constrenderer=newTHREE.WebGLRenderer({antialias:true});renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(renderer.domElement);constcontrols=newOrbitControls(camera,renderer.domElement);controls.enableDamping=true;// 创建纹理constcanvas=document.createElement('canvas');canvas.width=512;canvas.height=512;constctx=canvas.getContext('2d');ctx.fillStyle='#ff6600';ctx.fillRect(0,0,canvas.width,canvas.height);ctx.fillStyle='#ffffff';ctx.font='Bold 40px Arial';ctx.fillText('Three.js',canvas.width/2-100,canvas.height/2);consttexture=newTHREE.CanvasTexture(canvas);// 顶点着色器constvertexShader=`varying 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; }`;// 片元着色器constfragmentShader=`uniform 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}};constmaterial=newTHREE.ShaderMaterial({uniforms:uniforms,vertexShader:vertexShader,fragmentShader:fragmentShader,side:THREE.DoubleSide});// 创建几何体constgeometry=newTHREE.SphereGeometry(1,64,64);constmesh=newTHREE.Mesh(geometry,material);scene.add(mesh);// GUI 控制importGUIfrom'lil-gui';constgui=newGUI();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.value+=0.01;mesh.rotation.y+=0.005;controls.update();renderer.render(scene,camera);}animate();window.addEventListener('resize',onWindowResize,false);functiononWindowResize(){camera.aspect=window.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投影矩阵

http://www.jsqmd.com/news/747691/

相关文章:

  • Craw4LLM:为LLM训练打造智能爬虫,从网页中提取高质量数据
  • 别再为单片机EEPROM不够用发愁了!手把手教你用AT24C32扩展存储(附完整Arduino/STM32代码)
  • STM32F411从HSI切换到HSE,你的25MHz晶振真的起振了吗?一个硬件工程师的排查笔记
  • 不会开发AI Skill,你明天可能还在改自动化脚本
  • 量子启发式KAN-LSTM:时序预测新突破
  • 终极解决方案:5分钟让魔兽争霸3在Win10/Win11完美运行
  • AI开发合规指南:从API封禁案例看服务条款与安全实践
  • 纯前端AI账单分析器:零服务器部署,浏览器内保障数据隐私
  • 第五部分-后期特效与着色器——27. 高级着色器
  • LwIP内存池(memp.c)设计精妙在哪?从‘挖坑占位’到链表操作,一个简化版C程序全讲透
  • Node.js终端光标控制:tiny-cursor库的原理与实践
  • 上海APP开发技术路径深度解析:从架构选型到工程落地
  • 第五部分-后期特效与着色器——25. 内置特效
  • 2026现阶段,浙江企业团建为何首选“包吃包住”?深度解析与高口碑目的地推荐 - 2026年企业推荐榜
  • Sunshine:5分钟搭建个人游戏串流服务器,让任何设备都能畅玩PC游戏
  • Hugging Face lerobot:机器人学习的开源利器与应用实践
  • 2025届毕业生推荐的AI学术方案横评
  • 论文自动转视频技术:Paper2Video框架解析与应用
  • 终极星露谷物语模组合集指南:15个必备SMAPI模组提升游戏体验
  • MOREBENCH:大语言模型道德推理能力评估新基准
  • Java实现Llama 3本地推理:轻量级引擎设计与企业级集成实践
  • 物理引擎如何提升AI舞蹈动作的自然度
  • Tracecat:AI原生安全自动化平台架构解析与实战指南
  • 2026年AI真人剧人才培训**指南:如何选择高通过率的机构 - 2026年企业推荐榜
  • BM25算法解析:信息检索的核心排序技术
  • 别再手动K帧了!Blender 3.6自动关键帧与插值技巧,让你的动画丝滑又高效
  • 网盘直链下载助手LinkSwift:八大网盘免费获取真实下载链接的终极解决方案
  • 别再让电机发烫!STM32 FOC开环标定零电角度的安全操作指南
  • PDPS镜像对象保姆级教程:从单个零件到整站布局,5分钟搞定对称模型
  • 50.YOLOv8 工业级全流程实战(CUDA118):训练 + 推理 + ONNX 导出 + TensorRT 加速 + Flask 部署,全套可复制源码 + 避坑指南