3D纹理的OpenGL高斯内核
OpenGL Gaussian Kernel on 3D texture
我想在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纹理样本,这比连续模糊便宜得多)。
- 在C++上实现高斯赛德尔迭代方法
- C++:矩阵高斯消除不起作用:使用单维数组来存储元素
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 用于创建高斯随机数的 c++ 函数
- 将高斯模糊应用于灰度图像
- 高斯雅各比法
- 用高斯Seidel红色黑色求解1D泊松方程
- 如何改变高斯分布(提升)中的种子
- 并行化高斯模糊链
- 为什么在 C++ 中实现高斯勒让德算法没有产生结果
- 生成高斯噪声
- 部分透视/高斯消除 - 交换列而不是产生错误输出的行
- 使用高斯模糊进行图像卷积,可以加速
- 如何使用 1D 高斯内核在 Filter2D 上创建自定义 2D 内核
- ***检测到堆栈粉碎***:在高斯消除中
- 使用C 加入高斯噪声
- 高斯滤波器核值
- 用于高斯过程的准随机数生成器
- 使用C++的高斯分布没有均值和标准偏差
- 3D纹理的OpenGL高斯内核