繁体   English   中英

3D纹理上的OpenGL高斯内核

[英]OpenGL Gaussian Kernel on 3D texture

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

我目前拥有3D纹理,并使用imageStore进行填充。 我应该为纹理创建其他2个副本还是使用单一纹理的方法?

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

简而言之,由于不是2D图像,因此无法在3次扫描中完成。 即使内核是可分离的。 您必须分别对每个图像切片进行模糊处理,其中图像需要进行2次遍历(如果您使用的是256x256x256纹理,则只有512次遍历是为了沿U和V坐标进行模糊处理)。 您仍然必须沿T和U(或T和V:无所谓)坐标模糊,这是另外512次传递。 通过使用双线性滤波器并读取纹理像素之间的值,可以节省性能,从而节省了一定的处理成本。 3D模糊将非常昂贵。

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

传递如此之多的问题是GPU与CPU之间的交互次数:绘画调用和FBO设置均是挂起CPU的缓慢操作(可能是具有较低CPU开销的其他API会更快)

尝试不分离内核:

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

随时间传播工作:

内核是否分离无关紧要。 不必每隔一帧计算一次高斯模糊,而是每秒钟计算一次(也许使用更大的内核)。 然后,将上一个模糊和下一个模糊的插值用作“连续模糊数据”的源(每个帧都是2x 3D纹理样本,比连续模糊便宜得多)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM