我的问题涉及在GPU上执行几何图像变换的最有效方法。目标主要是实时消除获取图像中的镜头失真。我可以想到几种方法,例如作为CUDA内核(这将是更好的)进行逆变换查找+插值,或在OpenGL着色器中相同,或渲染具有映射到它的图像纹理的正向变换网格。在我看来,最后一个选项可能是最快的,因为网格可以被子采样,即不是每个像素偏移都需要存储,但可以在顶点着色器中进行插值。此外,图形管道确实应该针对此进行优化。但是,其余的图像处理可能都是用CUDA完成的。如果我想使用OpenGL管道,我是否需要启动一个OpenGL上下文并打开一个窗口来进行渲染,或者这可以通过CUDA / OpenGL互操作以某种方式实现?目的不是显示图像,处理将在服务器上进行,可能没有附加显示。我听说如果打开一个窗口,这可能会导致OpenGL崩溃。
我对GPU编程很陌生,任何见解都会非常感激。
答案 0 :(得分:1)
使用正向变换网格方法是更灵活,更容易实现的方法。然而,性能方面没有太大区别,因为您遇到的有效限制是内存带宽,并且消耗的内存带宽量仅取决于输入图像的大小。如果它是一个片段着色器,由顶点或CUDA纹理访问提供,导致传输并不重要。
如果我想使用OpenGL管道,我是否需要启动OpenGL上下文并打开一个窗口来进行渲染,
在Windows上:是的,但窗口可能是不可见的。
在GLX / X11上,您需要运行X服务器,但您可以使用PBuffer而不是窗口来获取OpenGL上下文。
在任何一种情况下都使用Framebuffer对象作为实际绘图目标。 PBuffers可能随时破坏其主帧缓冲内容。 Framebuffer对象是安全的。
或者这可以通过CUDA / OpenGL互操作以某种方式实现吗?
不,因为CUDA / OpenGL互操作用于使OpenGL和CUDA互操作,而不是使CGLA的OpenGL工作。 CUDA / OpenGL Interop可以帮助您完成此处提到的部分:
然而,其余的图像处理可能会用CUDA完成。
顺便说一句;也许OpenGL计算着色器(自OpenGL-4.3起可用)也适用于你。
我听说如果打开一个窗口,这可能会导致OpenGL崩溃。
OpenGL实际上对这些事情没有发言权。它只是用于在画布上绘制内容的API(canvas = window或PBuffer或Framebuffer Object),但它并不涉及在脚手架上实际获取画布,可以这么说。
从技术上讲,OpenGL并不关心是否有窗口。它是创建OpenGL上下文的图形系统。不幸的是,目前现有的GPU图形系统都没有支持真正的无头操作。 NVidia的最新Linux驱动程序可能允许一些粗暴的黑客设置真正的无头系统,但到目前为止我从未尝试过。