1

我想在 openGL 中对 3D 纹理进行模糊处理。由于它是可分离的,我应该能够在 3 遍中完成它。我的问题是,应对它的最佳方法是什么?

我目前有 3D 纹理并使用 imageStore 填充它。我应该为模糊创建其他 2 个纹理副本,还是有办法在使用单个纹理时做到这一点?

我已经在使用 glCompute 来计算 3D 纹理的 mip 贴图,但在这种情况下,我从级别 0 的纹理读取并写入下一层的纹理,因此没有冲突,而在这种情况下,我需要一些复制。

4

1 回答 1

0

简而言之,它不能在 3 遍中完成,因为它不是 2D 图像。即使内核是可分离的。您必须分别模糊每个图像切片,即图像的 2 个通道(如果您使用 256x256x256 纹理,那么您有 512 个通道仅用于沿 U 和 V 坐标进行模糊)。您仍然必须沿 T 和 U(或 T 和 V:无关)坐标模糊,这是另外 512 次传球。您可以通过使用双线性过滤器和读取纹素之间的值来获得性能,以节省一些恒定的处理成本。3D 模糊将非常昂贵。

性能提示:也许您不需要模糊整个纹理而只需要模糊其中的一部分?(可见部分?)

如此多的通过次数的问题是GPU和CPU之间的交互次数:drawcalls和FBO设置都是挂起CPU的慢操作(可能具有低CPU开销的不同API会更快)

尽量不要分离内核:

如果你有一个小内核(我猜最多 5^3,只有分析会显示最大内核大小)可能最快的方法是不分离内核(就是这样,你节省了大量的绘图调用和 FBO 绑定并利用一切到 GPU 填充率和带宽)。

随着时间的推移分散工作:

您的内核是否分离并不重要。您可以每秒计算一次,而不是每帧计算一次高斯模糊(也许使用更大的内核)。然后,您将前一个模糊和下一个模糊的插值用作“连续模糊数据”的来源(每帧是 2x 3D 纹理样本,这比连续模糊便宜得多)。

于 2014-08-09T11:17:09.440 回答