3D纹理的OpenGL高斯内核

OpenGL Gaussian Kernel on 3D texture

本文关键字:高斯 内核 OpenGL 纹理 3D      更新时间:2023-10-16

我想在openGL中对3D纹理执行模糊。因为它是可分离的,我应该可以在三遍内完成。我的问题是,最好的应对方式是什么?

我目前有3D纹理,并使用imageStore填充它。我是否应该为模糊创建另外2个纹理副本,或者有一种方法可以在使用单个纹理的同时做到这一点?

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

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

性能提示:也许你不需要模糊整个纹理,但只需要它的一部分?(可见部分?)

这样的高传递数的问题是GPU和CPU之间的交互数量:drawcall和FBO设置都是挂起CPU的缓慢操作(可能使用低CPU开销的不同API会更快)

尽量不分离内核:

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

按时间分配工作:

与内核是否分离无关。而不是每帧计算高斯模糊,你可以每秒钟计算一次(也许用一个更大的内核)。然后你使用前一个模糊和下一个模糊的插值作为"连续模糊数据"的来源(这是每帧2倍3D纹理样本,这比连续模糊便宜得多)。