【发布时间】:2011-04-12 22:44:25
【问题描述】:
我有一个应用程序,我需要为大约 100 万张图像获取图像的平均强度。它“感觉”像是 GPU 片段着色器的工作,但片段着色器用于按像素进行局部计算,而图像平均是全局操作。
我考虑的一种方法是将图像加载到纹理中,应用 2x2 框模糊,将结果加载回 N/2 x N/2 纹理并重复直到输出为 1x1。但是,这需要 log n 次着色器应用程序。
有没有办法一次性完成?还是我应该分解并使用 CUDA/OpenCL?
【问题讨论】:
-
我的应用程序正在将投影的 3D 模型与输入图像进行倒角匹配。我渲染包含模型轮廓边缘的图像,并且对于每个边缘像素,我使用查找表来查找输入图像中最近的边缘像素。然后我需要平均结果,它告诉我模型很适合数据。我尝试从 opengl 读取渲染的边缘像素并在 CPU 上进行倒角匹配,但读取操作是一个很大的瓶颈。我希望通过在 GPU 上完成所有操作并仅读取单个值,我会获得很大的加速。
-
(ctd) 因为我可以将查找表作为纹理传递,所以我可以在顶点着色器中进行查找,但我仍然存在将数据读回主内存的瓶颈。
-
在此处查看类似问题-
stackoverflow.com/questions/2944290/… -
没有什么能强迫你做 2x2 的模糊,例如你可以用 16x16 的盒子做模糊,然后将结果加载到 N/16 x N/16 纹理中。这样,您可以实现大幅加速和更少的复制操作......
-
我们还必须考虑纹理复制操作。例如对于 4096x4096 图像,如果内核是 2x2 - 它需要 12 个内存复制操作,但对于 16x16 内核 - 它只是 3 个复制操作。这就是为什么我说需要进行实验检查什么内核大小是最佳的,因为最小化顺序操作会增加内存复制操作的总数,这可以摊销加速。
标签: opengl image-processing gpu glsl