1

计算着色器在分派时需要工作组计数。这必须以 3 个维度提供。计算着色器本身指定的工作组大小也是如此。

在 OpenGL 中调度计算着色器的函数: glDispatchCompute

问题:

  • 为什么有 3 个维度?
  • 为什么不通过 1 个大数字?
  • 3个维度如何产生实际数字?
4

1 回答 1

2

有些计算本质上是 2 维或 3 维的。并且有些计算本质上是一维的。有人会感到不便。要么多维用户必须获取一维索引并将其转换为 2/3D 索引,要么一维用户可能必须获取 2/3D 索引并将其压缩为 1D。

当然,请注意“will”和“may”之间的区别。如果调度命令的 X 维度的实现限制太小而无法运行足够的调用,则单维度用户只需要识别 Y 或 Z 维度。鉴于所有实现必须为每个维度提供至少 65535 个工作组,这涵盖了很多领域。

因此,虽然计算操作的多维性质可能会给单维工作带来不便,但仍有大量单维工作不会带来不便。所以“可能”优于“将”。

3个维度如何产生实际数字?

假设您需要在单维计算操作中使用 Y 和 Z 坐标(而且您很少这样做),有很多方法可以做到这一点。它们仅在不同维度的顺序方面有所不同。以下方式使用gl_LocalInvocationIndex排序。

如果您需要获取特定工作组的索引,这很容易:

uint WorkGroupIndex = dot(gl_WorkGroupID, uvec3(1, gl_NumWorkGroups.x, gl_NumWorkGroups.x * gl_NumWorkGroups.y));

如果您需要为整个调度调用中的每个调用获取索引,请WorkGroupIndex执行以下操作:

uint UniqueIndex = (WorkGroupIndex * gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z) + gl_LocalInvocationIndex;
于 2018-05-09T00:23:39.760 回答