GPGPU
General Purpose GPU:把计算搬GPU
GPGPU是利用GPU并行能力做通用计算,常通过纹理存储状态并用shader迭代计算,适用于粒子、流体和大规模并行模拟。
GPGPU = General Purpose GPU
用GPU做通用计算,而不仅仅画图。
本质
原来 GPU 只干:
渲染图形
比如:
- 画三角形
- 着色
- 光照
后来发现 GPU 特别擅长:
大规模并行计算
于是:
拿它做:
非图形计算
这就是 GPGPU。
为什么 GPU 适合计算
CPU:
少量强核心
擅长复杂逻辑。
GPU:
海量简单核心
擅长并行。
比如:
100万个粒子更新。
CPU循环:
for(...)
慢。
GPU:
并行同时算
很快。
思想
不是:
GPU帮CPU一点
而是:
把计算任务搬到GPU
在 WebGL/Three 常见实现
你熟悉的通常是:
Texture作为数据
这是经典 trick。
用纹理存数据
不是存颜色:
存:
位置
速度
状态
例如:
RGBA
存粒子数据。
Fragment Shader做计算
不是渲染颜色:
而是在 shader 算:
下一帧位置
例如:
position += velocity * dt
结果写到:
RenderTarget纹理
再下一帧读回来。
Ping-Pong
双buffer:
A读 B写
下一帧
B读 A写
乒乓。
经典 GPGPU。
流程
数据放纹理
↓
shader计算
↓
写新纹理
↓
下一轮继续
本质像 GPU版状态机。
常见应用
1 粒子系统
超经典。
百万粒子:
位置更新放GPU
2 流体模拟
烟雾
水
流场
3 布料模拟
约束计算。
4 Boids群体行为
鱼群。
鸟群。
很经典 GPGPU demo。
5 高度场 / 波浪
大量顶点并行更新。
在 Three.js 里
很经典:
GPUComputationRenderer
专门做这个。
你可能见过:
GPUComputationRenderer(...)
就是它。
为什么叫“伪计算”
在 WebGL1/2 时代:
本来没有 compute shader。
只能:
借 fragment shader 做计算
很巧妙。
WebGPU更正规
WebGPU
有:
Compute Shader
原生 GPGPU。
更正统。
和普通 Shader区别
普通 shader:
为了画图
GPGPU shader:
借GPU算数据

浙公网安备 33010602011771号