gpt4 book ai didi

c++ - 3D 纹理上的 OpenGL 高斯内核

转载 作者:太空宇宙 更新时间:2023-11-04 13:47:39 32 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

如此大量通过的问题是 GPU 和 CPU 之间的交互次数:drawcalls 和 FBO 设置都是缓慢的操作,会挂起 CPU(可能是 different API 与低 CPU 开销会更快)

尽量不要分离内核:

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

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

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

关于c++ - 3D 纹理上的 OpenGL 高斯内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25180367/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com