3D纹理上的OpenGL高斯内核

时间:2014-08-07 10:39:15

标签: c++ opengl 3d-texture

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

我目前拥有3D纹理并使用imageStore填充它。我是否应该为模糊创建其他2个纹理副本,或者在使用单个纹理时是否有办法实现?

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

1 个答案:

答案 0 :(得分:0)

简而言之,它不能在3次通过中完成,因为它不是2D图像。即使内核是可分离的。 你必须分别模糊每个图像切片,图像是2次通过(如果你使用256x256x256纹理,那么你只有512次通过,只是为了沿U和V坐标模糊)。你仍然需要沿T和U(或T和V:无差异)坐标模糊,这是另外512次传球。您可以使用bilinear filter获取性能并读取纹素之间的值以节省一些不变的处理成本。 3D模糊将非常昂贵。

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

这种高通过次数的问题是GPU和CPU之间的交互次数:drawcalls和FBO设置都是挂起CPU的慢速操作(可能是{{3}低CPU开销会更快)

尝试不分离内核:

如果你有一个小内核(我想最多5 ^ 3,只有分析会显示最大内核大小),最快的方法可能是不分离内核(那就是它,你节省了很多drawcalls和FBO绑定并利用GPU填充和带宽的所有内容。)

随着时间的推移传播工作:

内核是否分离无关紧要。而不是每帧计算高斯模糊,你可以每秒计算它(可能有更大的内核)。然后你使用"继续模糊数据"前置模糊和下一个模糊的插值(每帧有2x 3D纹理样本,比连续模糊要便宜得多)。