使用计算着色器计算 mipmaps,已经完成了吗?

Calculating mipmaps with compute shaders, has it been done?

我正在使用计算着色器手动生成 mipmap,因为我不是简单地过滤而是在其中进行一些计算。

直接的方法是,对于第 1 级的每个纹素,读取它在第 0 级中对应的四个纹素,进行过滤,然后写入纹素。对整个关卡都这样做,然后对下一个关卡重复。

但是必须有一个更快的方法:)而不是读取 0 级,编写 1 级,然后再次读取 1 级,编写 2 级等。它可能更有效,例如读取 0 级的图块,然后在同一个调度调用中迭代地写入接下来几个级别的所有值。这样,最多可以保存一半的读数。

我的问题是,这已经完成了吗?我对已证明有效的更详细的算法感兴趣。

具体来说,我正在实施一种推拉算法,该算法首先从最大到最小计算这些 miplevel。在第二步中,它会细化 miplevel,从倒数第二个开始,使用原始纹素或 coarser miplevel 中四个周围纹素的插值。我也希望看到对此的高效计算方案,但无法通过谷歌搜索找到任何方案。

我没有意识到这基本上是具有一些约束的并行归约。对于并行缩减,NVIDIA 提供了一份不错的白皮书,其中包含许多可能也适用于此的优化策略:https://docs.nvidia.com/cuda/samples/6_Advanced/reduction/doc/reduction.pdf

另外,我在这里找到了一个使用计算着色器进行缩小的示例实现:https://mynameismjp.wordpress.com/2011/08/10/average-luminance-compute-shader/ 虽然它有点过时,但他例如明确尝试向量化指令。