# 🎯 WebGL 极速入门(面试应急版)
WebGL 就是让你在浏览器里调用 GPU(显卡) 来画图的一种方式
# 一、WebGL vs Canvas 2D
| 技术 | 谁在画图 | 适合场景 | 性能 |
|---|---|---|---|
| Canvas 2D | CPU(中央处理器) | 简单图形、少量元素 | 几千个元素就卡 |
| WebGL | GPU(图形处理器) | 复杂3D、海量元素 | 数万个元素流畅 |
核心区别
Canvas 2D 用 CPU 画图,适合简单图形,几千个元素就卡。WebGL 用 GPU 画图,适合复杂3D和海量元素,可以轻松处理��万个点。
# 二、WebGL 应用场景(军工场景举例)
| 场景 | 说明 | 为什么用WebGL |
|---|---|---|
| 三维地形 | 战场地形、飞行航线 | 需要实时旋转、缩放 |
| 雷达扫描 | 3D立体扫描效果 | 需要光照、透明度效果 |
| 海量目标 | 同时显示上千个飞机/舰船 | Canvas会卡死 |
| 装备模型 | 坦克/导弹的3D模型展示 | 需要真实感渲染 |
# 三、WebGL 的"三座大山"(了解即可)
原生 WebGL 非常难,因为你要自己写着色器语言(GLSL),告诉 GPU 怎么画每个像素。
// 顶点着色器:告诉GPU每个点在哪儿
attribute vec3 position;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
// 片段着色器:告诉GPU每个像素什么颜色
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色
}
90% 的前端工程师用 Three.js 而不是原生 WebGL。Three.js 把复杂的 WebGL 操作封装成了简单的 JavaScript 对象。
# 四、Three.js 核心概念
# Three.js 基础示例(面试常考)
import * as THREE from 'three'
// 1. 创建场景
const scene = new THREE.Scene()
// 2. 创建相机(相当于眼睛)
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)
// 3. 创建渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
// 4. 创建物体
const geometry = new THREE.BoxGeometry() // 立方体
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }) // 绿色材质
const cube = new THREE.Mesh(geometry, material)
scene.add(cube)
camera.position.z = 5
// 5. 动画循环
function animate() {
requestAnimationFrame(animate)
// 让立方体旋转
cube.rotation.x += 0.01
cube.rotation.y += 0.01
renderer.render(scene, camera)
}
animate()
# 核心概念对照表
| Three.js 概念 | 通俗解释 |
|---|---|
| Scene | 整个3D世界,放所有东西的地方 |
| Camera | 你看世界的眼睛,决定看到什么 |
| Renderer | 负责把3D世界画到屏幕上 |
| Mesh | 物体 = 几何形状(Geometry) + 材质(Material) |
| Light | 光照,没有光就看不见颜色 |
# 五、面试常见问题(应急包)
# Q1:WebGL 和 Canvas 2D 有什么区别?
Canvas 2D 用 CPU 画图,适合简单图形,几千个元素就卡。WebGL 用 GPU 画图,适合复杂3D和海量元素,可以轻松处理上万个点。
# Q2:你用过 Three.js 吗?能做什么?
我了解 Three.js 的基本用法,比如创建场景、相机、物体、添加光照。在军工场景中,可以用它来展示三维地形、雷达扫描效果或装备模型。
# Q3:WebGL 性能优化有哪些方法?
- 减少绘制调用:合并网格
- 使用 LOD(细节层次):远处用低模
- 限制帧率:60fps 足够
- 离屏渲染 + 缓存
# 六、如果被问到"你没做过3D怎么证明你能学"
参考回答
虽然我之前项目以2D可视化为主,但我对Three.js有基本了解,知道它的核心概念和工作原理。而且WebGL本质是图形学在浏览器的实现,我有扎实的Canvas基础,对坐标系、矩阵变换、动画循环都很熟悉,相信能快速上手3D开发。