服务端3月1日 23:32
WebGL 1.0 和 WebGL 2.0 有什么区别?## 核心答案
WebGL 1.0 基于 OpenGL ES 2.0,WebGL 2.0 基于 OpenGL ES 3.0,这是两者最根本的差异。从面试角度,掌握以下五个关键区别即可覆盖大部分考点:
1. **着色器语言升级**:WebGL 1.0 使用 GLSL ES 1.0(`attribute`/`varying`/`gl_FragColor`),WebGL 2.0 使用 GLSL ES 3.0(`in`/`out`/`自定义输出变量`),必须声明 `#version 300 es`。
2. **关键特性从扩展变原生**:3D 纹理、MRT(多重渲染目标)、实例化渲染、VAO(...服务端3月1日 23:30
WebGL 中的纹理(Texture)如何使用?有哪些纹理参数需要配置?## 纹理是 WebGL 渲染的核心机制
纹理(Texture)是将 2D 图像数据映射到 3D 几何体表面的技术。在 WebGL 中,几乎所有视觉效果——地板砖纹、角色皮肤、天空背景——都依赖纹理实现。理解纹理的使用流程和参数配置,是掌握 WebGL 的关键一步。
## 纹理使用的完整流程
### 1. 创建并绑定纹理对象
```javascript
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
```
`bindTexture` 将纹理对象绑定到当前纹理单元,后续所有纹...服务端3月1日 23:26
WebGL 中的 Shader 是什么?顶点着色器和片段着色器有什么区别?## Shader 是什么
Shader(着色器)是运行在 GPU 上的小型程序,负责控制图形渲染管线的各个阶段。WebGL 使用 GLSL(OpenGL Shading Language)编写着色器代码,一个最小的 WebGL 渲染程序必须包含两个着色器:顶点着色器和片段着色器。
理解 Shader 的关键在于搞清楚渲染管线的数据流向:JavaScript 将顶点数据传入 GPU → 顶点着色器逐顶点处理 → 图元装配与光栅化 → 片段着色器逐像素着色 → 最终输出到屏幕。
## 顶点着色器(Vertex Shader)
顶点着色器是渲染管线的第一个可编程阶段,对每个顶点执行一...服务端3月1日 23:35
WebGL 性能优化有哪些常用技巧?## 减少 Draw Call
Draw Call 是 CPU 向 GPU 提交绘制命令的过程,每次调用都有固定开销,是最常见的性能瓶颈。
**批量绘制(Batching)**:将使用相同着色器的多个网格合并到一个缓冲区,用一次 `drawArrays` 替代多次调用。适合静态场景中的同类物体。
**实例化渲染(Instanced Rendering)**:WebGL 2.0 原生支持,适合渲染大量相同几何体(如森林中的树木、粒子系统):
```javascript
gl.drawArraysInstanced(gl.TRIANGLES, 0, vertexCount, insta...服务端3月1日 23:37
WebGL 帧缓冲区和离屏渲染的原理是什么?## 核心回答
帧缓冲区(Framebuffer Object, FBO)是 WebGL 中用于离屏渲染的机制。它允许将渲染结果输出到纹理或渲染缓冲区,而非直接显示到屏幕上。离屏渲染则是利用 FBO 将场景先渲染到纹理,再对纹理做二次处理或合成的技术。
一个完整的 FBO 由三种附件组成:
- **颜色附件**:存储颜色信息,通常绑定纹理(以便后续采样)
- **深度附件**:存储深度值,通常绑定渲染缓冲区(写入性能更优)
- **模板附件**:存储模板值,用于遮罩测试
## 创建帧缓冲区的完整步骤
创建一个可用的 FBO 分为四步:创建帧缓冲区对象、创建颜色附件(纹理)、创建...服务端3月2日 00:12
WebGL 中的光照模型有哪些?如何实现 Phong 光照模型?## WebGL 光照模型有哪些?
WebGL 中常用的光照模型分为两类:**局部光照模型**和**全局光照模型**。面试中重点考察的是局部光照模型,核心有三种:
| 光照模型 | 特点 | 典型用途 |
|---------|------|---------|
| Lambert(漫反射) | 仅计算漫反射,无高光 | 粗糙表面如墙壁、布料 |
| Phong | 环境光 + 漫反射 + 镜面反射 | 通用物体渲染 |
| Blinn-Phong | Phong 改进版,用半角向量替代反射向量 | 实际项目首选 |
此外还有基于物理的 PBR(Physically Based R...服务端3月2日 00:20
WebGL 中的后期处理(Post-processing)是如何实现的?## 为什么面试会问后期处理
后期处理是 WebGL 从「能渲染」到「能做出好效果」的关键一步。面试官问这个问题,本质上是想确认你是否理解渲染管线的完整流程,以及是否具备在帧缓冲区和着色器层面解决实际问题的能力。
## 后期处理的核心原理
后期处理的核心思路只有三步:
1. 把场景渲染到纹理(离屏渲染),而不是直接渲染到屏幕
2. 用着色器对这张纹理做图像处理
3. 把处理后的结果画到屏幕上
整个流程可以理解为:
```
场景渲染 → 颜色纹理(FBO) → 后期处理着色器链 → 屏幕
↓
深度/法线纹理(可选)
```
这...服务端3月1日 23:29
WebGL 中的矩阵变换有哪些?MVP 矩阵是什么?## WebGL 中的矩阵变换
3D 渲染的本质是将顶点从模型局部坐标一步步变换到屏幕像素坐标,而矩阵就是描述这些变换的数学工具。WebGL 中所有坐标变换都通过 4×4 齐次矩阵完成,理解这些矩阵的含义和组合方式是掌握 3D 图形编程的基础。
## 三种基本变换矩阵
### 平移矩阵
平移将物体沿 X、Y、Z 轴移动指定距离,是最直观的变换:
```
| 1 0 0 tx |
| 0 1 0 ty |
| 0 0 1 tz |
| 0 0 0 1 |
```
由于 3×3 矩阵无法表示平移(线性变换不包含偏移),所以必须引入齐次坐标——用 4D 向...服务端2月28日 21:40
什么是 Spring Boot 的自动配置原理?## Spring Boot 的自动配置原理是什么?
Spring Boot 的自动配置,简单说就是:根据你引入的依赖和已有的配置,自动帮你把该配的 Bean 都配好。你不用手写一堆 XML,也不用挨个注册 Bean,Spring Boot 帮你搞定。
这个能力背后靠的是三个核心机制:**SPI 发现配置类 → 条件注解过滤 → 属性绑定定制**。下面逐一拆解。
## 入口:@SpringBootApplication 做了什么?
启动类上的 `@SpringBootApplication` 是个复合注解,拆开来看:
```java
@SpringBootConfigurati...服务端2月28日 21:52
Spring Boot 中如何实现缓存?## 核心回答
Spring Boot 通过 **Spring Cache Abstraction** 提供统一的缓存抽象,开发者只需添加 `@EnableCaching` 注解和对应缓存实现依赖,即可用 `@Cacheable`、`@CachePut`、`@CacheEvict` 等注解实现声明式缓存。常用实现方案有三种:
- **ConcurrentMapCache**:基于 `ConcurrentHashMap`,零依赖,适合单机开发测试
- **Caffeine**:高性能本地缓存,支持过期策略和容量限制,适合单机生产环境
- **Redis**:分布式缓存,支持持久化和集群...