WebGL
🎯 教程特色
本教程采用对比学习法,每一节都包含:
- 原生 WebGL 实现:直接使用 WebGL API,理解底层原理
- Three.js 对比实现:用 Three.js 实现相同效果,理解框架封装
- 原理对比分析:理解 Three.js 如何封装 WebGL API
- 实战作业:每节末尾都有配套作业,巩固所学知识
📚 为什么需要对比学习?
- 理解底层:原生 WebGL 让你知道 GPU 真正在做什么
- 提高效率:Three.js 让你快速开发,但知其所以然
- 面试加分:理解框架封装原理,面试时能说出底层实现
- 问题排查:遇到性能问题时,知道如何优化底层
🗺️ 课程大纲
本教程共 12 节,从基础到实战,覆盖高级 Web 3D 工程师所需的核心技能。
第一阶段:WebGL 基础入门(第 1-4 节)
第 1 节:WebGL 渲染管线与坐标系统
- 原生 WebGL:理解渲染管线的 5 个阶段
- Three.js 对比:Scene、Camera、Renderer 如何映射到管线
- 作业:绘制一个简单的点,理解顶点着色器的作用
第 2 节:第一个三角形(顶点数据与缓冲区)
- 原生 WebGL:手动创建 Buffer、设置 vertexAttribPointer
- Three.js 对比:BufferGeometry 如何封装这些操作
- 作业:用原生 WebGL 绘制彩色三角形,然后用 Three.js 实现相同效果
第 3 节:着色器编译与程序链接
- 原生 WebGL:createShader、compileShader、linkProgram 的完整流程
- Three.js 对比:Material 系统如何管理 Shader
- 作业:手动编译一个简单的 Shader,理解编译错误处理
第 4 节:Uniform 变量与动画
- 原生 WebGL:使用 uniform1f、uniform3f 传递数据
- Three.js 对比:Material.uniforms 如何封装
- 作业:实现一个随时间变化的颜色动画
第二阶段:核心技能(第 5-7 节)
第 5 节:矩阵变换(MVP)
- 原生 WebGL:手动计算 MVP 矩阵,使用 uniformMatrix4fv
- Three.js 对比:Object3D 的矩阵自动更新机制
- 作业:实现一个旋转的立方体,理解矩阵乘法顺序
第 6 节:纹理映射
- 原生 WebGL:createTexture、texImage2D、sampler2D,纹理过滤与 Mipmap
- Three.js 对比:TextureLoader 和 Texture 类
- 作业:给立方体贴图,理解 UV 坐标
第 7 节:图像处理基础与卷积
- 原生 WebGL:将纹理用作图像数据源,计算 UV 跨度,在片段着色器中实现 3x3 卷积核运算
- Three.js 对比:通过 ShaderMaterial 实现自定义图像滤镜
- 作业:实现基于卷积的滤镜下拉切换(如高斯模糊、边缘检测等)
第 8 节:光照模型
- 原生 WebGL:实现 Lambert 和 Blinn-Phong 光照模型
- Three.js 对比:MeshStandardMaterial 的实现
- 作业:实现一个受光照的球体
第三阶段:高级特性(第 9-11 节)
第 9 节:帧缓冲与后处理
- 原生 WebGL:createFramebuffer、framebufferTexture2D
- Three.js 对比:RenderTarget 和 EffectComposer
- 作业:实现灰度、模糊等后处理效果
第 10 节:性能优化
- 原生 WebGL:减少 Draw Call、优化 Shader、纹理压缩
- Three.js 对比:InstancedMesh、Geometry Merging、LOD
- 作业:性能对比测试和优化实践
第 11 节:GPGPU 基础与应用
- 原生 WebGL:使用纹理进行数据计算(Data Textures)、Ping-Pong 缓冲技术
- Three.js 对比:使用
GPUComputationRenderer构建计算图 - 作业:实现基于 GPU 的粒子系统或生命游戏
第四阶段:综合实战(第 12 节)
第 12 节:综合实战
- 项目:创建一个完整的 3D 场景
- 要求:使用原生 WebGL 和 Three.js 两种方式实现
- 包含:场景管理、相机控制、光照系统、后处理、性能优化、GPGPU 粒子效果
- 对比:性能、代码量、开发效率
📝 作业系统
作业格式
每节作业包含:
- 基础作业(⭐):按照教程实现基本功能
- 进阶作业(⭐⭐):添加改进和优化
- 挑战作业(⭐⭐⭐):综合应用,需要创新
作业提交
- 每个作业创建独立的 HTML 文件
- 包含原生 WebGL 和 Three.js 两个版本
- 添加注释说明关键步骤
- 提供效果截图或 GIF
🎓 学习建议
- 循序渐进:不要跳节,每节都完成作业
- 对比理解:先写原生 WebGL,再写 Three.js,对比差异
- 动手实践:只看不练等于没学,必须写代码
- 调试技巧:学会使用浏览器调试工具
- 性能意识:理解 Draw Call、纹理大小、Shader 复杂度