antvis / g-webgl-compute

A GPGPU implementation based on WebGL.
MIT License
144 stars 15 forks source link

支持 onIterationCompleted 回调 #24

Closed xiaoiver closed 4 years ago

xiaoiver commented 4 years ago

问题背景

在需要多次迭代的场景中,目前只提供了 onCompleted 回调。但是可能任务需要在每次迭代中进行参数的更新,在 CPU 侧完成计算后希望传给 GPU,例如:

const compute = world.createComputePipeline({
  shader: '',
  precompiled: true,
  dispatch: [1, 1, 1],
  maxIteration: 1,
  onIterationCompleted: (iteration: number) => {
    world.setBinding(compute, 'u_K', Math.random());
  },
  onCompleted: (result) => {},
});

类似 3D 引擎中相机矩阵的更新方式,或者传入当前时间变量进行某种运动轨迹的计算。

xiaoiver commented 4 years ago

在回调函数中可以传入当前迭代参数,但不应该传当前的结果数据,例如:

onIterationCompleted: (iteration: number, result: number[]) => {
    world.setBinding(compute, 'u_K', Math.random());
},

原因是 readData 开销很大,通常用户也不会想要在每次迭代结束后都做这件事,在全部迭代完成后再一次性获取结果相对合理。

xiaoiver commented 4 years ago

另外还有一个限制是不支持在每次迭代后都修改数组类型例如 float[] vec4[] 等。 原因是在 WebGL 的实现中我们使用纹理存储,不希望在每次迭代后都重新生成纹理。