0

我的问题涉及在 GPU 上执行几何图像转换的最有效方法。目标本质上是从获取的图像中实时消除镜头失真。我可以想到几种方法来做到这一点,例如,作为一个 CUDA 内核(这将是更可取的)进行逆变换查找 + 插值,或者在 OpenGL 着色器中进行相同的操作,或者渲染一个正向变换的网格,并将图像纹理映射到它. 在我看来,最后一个选项可能是最快的,因为可以对网格进行二次采样,即不是每个像素偏移都需要存储,但可以在顶点着色器中进行插值。此外,图形管道确实应该为此进行优化。但是,其余的图像处理可能会使用 CUDA 来完成。如果我想使用 OpenGL 管道,我是否需要启动一个 OpenGL 上下文并打开一个窗口来进行渲染,或者这是否可以通过 CUDA/OpenGL 互操作以某种方式实现?目的不是显示图像,处理将在服务器上进行,可能没有附加显示器。我听说如果打开一个窗口,这可能会使 OpenGL 崩溃。

我对 GPU 编程很陌生,任何见解都将不胜感激。

4

1 回答 1

1

使用前向变换网格方法是一种更灵活、更容易实现的方法。但是性能方面没有太大区别,因为您遇到的有效限制是内存带宽,而消耗的内存带宽量仅取决于输入图像的大小。如果它是由顶点提供的片段着色器或导致传输的 CUDA 纹理访问,则无关紧要。

如果我想使用 OpenGL 管道,我是否需要启动一个 OpenGL 上下文并打开一个窗口来进行渲染,

在 Windows 上:是的,但窗口可以是不可见的。

在 GLX/X11 上,您需要运行 X 服务器,但您可以使用 PBuffer 而不是窗口来获取 OpenGL 上下文。

在任何一种情况下,都使用帧缓冲区对象作为实际的绘图目标。PBuffers 可能随时破坏它们的主帧缓冲区内容。帧缓冲区对象是安全的。

或者这是否可以通过 CUDA/OpenGL 互操作以某种方式实现?

不,因为 CUDA/OpenGL 互操作是为了让 OpenGL 和 CUDA 互操作,而不是让 OpenGL 从 CUDA 工作。CUDA/OpenGL Interop 可以帮助您完成您在此处提到的部分:

但是,其余的图像处理可能会使用 CUDA 来完成。

顺便提一句; 也许 OpenGL Compute Shaders(自 OpenGL-4.3 起可用)也适用于您。

我听说如果打开一个窗口,这可能会使 OpenGL 崩溃。

OpenGL 在这些事情上实际上没有发言权。它只是一个用于在画布上绘制东西的 API(canvas = window 或 PBuffer 或 Framebuffer 对象),但它并不涉及实际在脚手架上获取画布,可以这么说。

从技术上讲,OpenGL 并不关心是否有窗口。它是创建 OpenGL 上下文的图形系统。不幸的是,目前现有的 GPU 图形系统都不支持真正的无头操作。NVidia 最新的 Linux 驱动程序可能允许一些粗略的黑客设置一个真正的无头系统,但到目前为止我从未尝试过。

于 2013-06-16T11:44:22.987 回答