是否已使用计算着色器计算mipmap?

时间:2016-07-30 20:21:21

标签: algorithm opengl compute-shader

我手动生成带有计算着色器的mipmap,因为我不是简单地过滤,而是在那里进行一些计算。

直接方法是,对于级别1的纹素,读取级别0中的四个对应纹素,进行过滤,然后写入纹素。为整个级别做到这一点,然后重复下一个级别。

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

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

具体来说,我正在实现一种推拉算法,该算法首先计算从最大到最小的那些miplevels。然后在第二步中,使用原始纹理元素或粗糙 miplevel中四个周围纹素的插值,从第二个到最小的一个细化级别。我希望看到有效的计算方案,但通过谷歌搜索无法找到。

1 个答案:

答案 0 :(得分:1)

我没有意识到这基本上是一个带有一些约束的平行减少。对于并行缩减,有一个很好的白皮书来自NVIDIA,其中有许多优化策略也适用于此:https://docs.nvidia.com/cuda/samples/6_Advanced/reduction/doc/reduction.pdf

此外,我在这里找到了一个使用计算着色器降尺度的示例实现:https://mynameismjp.wordpress.com/2011/08/10/average-luminance-compute-shader/虽然它有点过时,但是,例如明确地试图对指令进行矢量化。