Debug Shader

阅读时间约 1 分钟

对于习惯了浏览器提供 devTools 的前端开发者来说,Shader 的 debug 是非常困难的,显然我们没法使用调试工具加断点。 因此我们只能借助渲染 API 的某些特性,将开发者关心的变量值打印输出,类似 console.log

首先通过 import 引入 debug 方法:

import { debug } from 'g-webgpu';

然后在函数中就可以输出变量值了:

sum(a: float, b: float): float {
    debug(a);
    return a + b;
}

最后在 onCompleted 回调函数中可以获取该变量的结果。

看起来使用很简单,但是受限于 WebGL 的实现,存在以下限制。

使用限制

仅调用一次

多次调用 debug 仅最后一条生效,例如:

sum(a: float, b: float): float {
    debug(a);
    debug(b); // 最后输出的是 b 的值
    return a + b;
}

仅支持输出一个变量

只支持输出一个变量,其中该变量类型包括:

  • 标量 float int bool
  • 向量 vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4

单次迭代

对于需要进行多次迭代的算法,建议将 maxIteration 设置成 1 之后再进行调试。 否则输出的调试变量结果可能会影响后续迭代的运算。

padding

对于输出变量类型为向量数组的情况,如果我们输出的变量类型为标量,输出结果中的多余部分会用 0 填充。

例如我们的输出为 vec4 数组,尝试打印每一个线程的全局线程索引,该变量为 int

@in @out
u_Data: vec4[];

@main
compute() {
    const i = globalInvocationID.x;
    debug(i);
}

最终得到的结果为 [0,0,0,0, 1,0,0,0, 2,0,0,0...]