Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用OpenGL修改图像?_C++_Opengl - Fatal编程技术网

C++ 使用OpenGL修改图像?

C++ 使用OpenGL修改图像?,c++,opengl,C++,Opengl,我有一个设备来获取X光图像。由于一些技术限制,探测器由不同大小的像素和多个倾斜和部分重叠的瓷砖组成。图像因此失真。探测器的几何结构是精确已知的 我需要一个函数将这些扭曲的图像转换成均匀像素大小的平面图像。我已经通过CPU完成了这项工作,但我想尝试一下OpenGL,以一种可移植的方式使用GPU 我没有OpenGL编程的经验,我能在网上找到的大部分信息对于这种用途都是无用的。我应该如何进行?我该怎么做 图像大小为560x860像素,我们需要处理720幅图像。我使用的是Ubuntu。而不是OpenGL

我有一个设备来获取X光图像。由于一些技术限制,探测器由不同大小的像素和多个倾斜和部分重叠的瓷砖组成。图像因此失真。探测器的几何结构是精确已知的

我需要一个函数将这些扭曲的图像转换成均匀像素大小的平面图像。我已经通过CPU完成了这项工作,但我想尝试一下OpenGL,以一种可移植的方式使用GPU

我没有OpenGL编程的经验,我能在网上找到的大部分信息对于这种用途都是无用的。我应该如何进行?我该怎么做


图像大小为560x860像素,我们需要处理720幅图像。我使用的是Ubuntu。

而不是OpenGL,这听起来像是CUDA,或者更一般的GPGPU问题


如果你已经有C或C++代码来完成它,CUDA应该只需计算你想在GPU上使用的类型以及算法是如何被平铺的。您可能能够进行多次传递并使用着色器来获得所需的内容,但最好在OpenCL中重新编写算法。这样做的好处是,如果没有可用的图形加速卡,您甚至可以使用多核CPU。如果您想使用OpengGL实现这一点,通常可以将当前数据作为纹理提供,然后编写一个片段着色器来处理该数据,并将其设置为渲染纹理。输出纹理完全渲染后,可以将其检索回CPU并将其作为文件写入


我担心,如果你不知道自己在做什么,就很难做一个非常笼统的总体流程草图。但是如果(正如你所说)你已经用CUDA做了这件事,那么你显然已经对大部分细节有了相当清楚的了解。

你在这里问的核心问题是“我如何使用GPU来解决这个问题?”

现代GPU本质上是线性代数引擎,因此您的第一步是将问题定义为一个矩阵,该矩阵将输入坐标转换为同质空间中的输出坐标:

例如,将x按½缩放,y按1.2缩放,向上和向左平移两个单位的变换表示为:

你也可以计算出类似的变换,等等

将变换表示为矩阵向量乘法后,只需将源数据加载到纹理中,将变换指定为,然后将其渲染为结果。GPU执行每像素的乘法运算。(您还可以编写着色器等,它们可以进行更复杂的数学运算,将多个向量和矩阵作为因子,等等,但这是基本思想。)

这就是说,一旦您将问题表示为线性变换,您也可以通过利用例如SIMD或其中的一种,使它在CPU上运行得更快。除非您需要实时性能或需要处理大量数据,否则使用CUDA/GL/着色器等可能比严格意义上更麻烦,因为初始化库、设置渲染目标、学习图形开发的细节等都涉及一些笨拙的机制

只需将内部循环从即席数学转换为优化良好的线性代数子例程,就可以在CPU上提供足够的性能提升

您可能会发现它很有用(它有点旧,但请注意,它在Cg部分之后确实包含一些OpenGL 2.x GLSL)。我不相信在GLSL中有任何图像处理的捷径,如果这就是你想要的。。。要有效地使用它,您确实需要了解很多3D光栅化方面和历史包袱,尽管一旦设置了输入和输出框架,您就可以忘记这一点,并相对轻松地在着色器代码中使用自己的算法


多年来一直在做这类事情(最初使用Direct3D着色器,但最近使用CUDA),我必须说,我完全同意这里推荐CUDA/OpenCL的帖子。它使生活简单得多,而且通常运行得更快。现在,我不得不不顾一切地回到非图形算法的图形API实现上。

我已经在CUDA中编程,但正在寻找OpenGL应该能够提供的便携式解决方案。另一件事是Ubuntu对CUDA不友好。CUDA与Ubuntu完美配合。我在Ubuntu 9.04/9.10/10.04和NVIDIA的CUDA SDK上做了很多工作。当然,CUDA仅限于Nvidia硬件…是的。。。CUDA和OpenCL在Ubuntu上运行良好。OpenCL可能是更好的主意,它更具可移植性。如何安装与OpenCL兼容的驱动程序?我在生产电脑上有一个NVIDIA 8800GT,可以得到一个更强大的卡(即GTX285)。只需确保您拥有最新版本的视频驱动程序本身。OpenCL和CUDA安装在所有的库中,但它们使用标准的NVidia专有视频驱动程序。8800GT是一个非常强大的GPU,它的计算能力大约是你的CPU的15倍,即使它是四核。OpenGL比OpenCL更便携,尤其是在Ubuntu上。OpenCL与Ubuntu完美结合。我已经用Ubuntu 9.04-10.04和NVIDIA的OpenCLSDK做了很多工作。@danvil如何安装驱动程序?我“手动”安装了驱动程序,但每次更新内核时,我都会发现自己在VGA中,必须重新安装驱动程序。我是在我的工作电脑上做的,但这在生产机器上是不可接受的。必须重新编译驱动程序内核模块以匹配新的内核版本。对于其他一些模块,这已经自动完成。英伟达模块必须手动添加。(这是重新安装驱动程序的唯一必要步骤)。这就是我无法在生产PC上使用此功能的原因。每次安装时,用户都会看到VGA屏幕