硬件高效的OpenGL

Posted

技术标签:

【中文标题】硬件高效的OpenGL【英文标题】:hardware efficient OpenGL 【发布时间】:2013-02-28 18:39:59 【问题描述】:

我编写了一个 c++ 代码,并将我的帧数据存储在缓冲区中。由于我正在开发自己的 DSP 算法来进行眼睛检测,因此我需要处理数据以适合我的算法。 但是,好消息是我必须一次对所有像素应用相同的指令。这就是为什么我想知道 OpenGL 是否有一种有效的方法来做到这一点(例如,一次将所有像素乘以一个数字)?

不幸的是,在我正在使用的硬件平台上,OpenCV 不支持 SIMD,这就是我无法使用 OpenCV 的原因。 但是,支持 OpenGL,并且大多数函数调用都是硬件优化的(这意味着它们可以直接与 GPU 对话)。 所以,我很好奇是否可以在 OpenGL 中执行这样的功能,如果可以,谁能给我一些示例代码,告诉我如何有效地处理大数据。

【问题讨论】:

是的,您应该能够在 OpenGL 着色器中做到这一点。如果支持,OpenCL 可能会更好。 【参考方案1】:

是的,你可以做到。它的基本要点是,您将输入数据作为纹理或顶点数据加载到 GPU 上,使用进行计算的着色器进行渲染,然后将结果读回内存。 GPGPU.org 是此类事情的一个很好的资源,因为它们自 CUDA/OpenCL 之前的时代就已经存在。

http://gpgpu.org/developer/legacy-gpgpu-graphics-apis

【讨论】:

非常感谢您的回复。很高兴发现有办法做到这一点。 顺便说一句,我只是好奇OpenGL是否可以将输入数据作为内存中已有的数据除外,或者它必须从文件中读取数据?此外,OpenGL 是否提供任何硬件 Jpeg 解码?还是 OpenGL 并没有真正处理 Jpeg 解码? @user2112840:OpenGL 不接受来自任何内存之外的地方的输入数据。 OpenGL 不知道文件是什么。 OpenGL 不知道 JPEG 是什么。 OpenGL 采用像素或用certain very specific texture-only formats. 压缩的图像 所以纹理本身就是一个缓冲区,对吗?所以,我会将我的数据(存储在内存中的某处)加载到内存中的其他空间(纹理),然后着色器使用数据,对吗?无论如何我可以减少一些开销吗?因为看起来我会在着色器访问数据之前在内存中存储两次!!! 是的,差不多。将所有数据传输到卡上需要相当多的开销——我认为 CUDA/OpenCL 在这里没有任何优势——这个想法是,对于正确的算法,你不仅仅是用GPU 的计算能力。

以上是关于硬件高效的OpenGL的主要内容,如果未能解决你的问题,请参考以下文章

OpenGLOpenGL中的Buffer的巧妙使用

高效硬件和渲染优化

硬件高效的OpenGL

在硬件中高效实现 DXT1 纹理解压

软硬件融合新时代——让软件够灵活,硬件够高效,鱼和熊掌可兼得

Vivado HLS Coding Style-22维卷积:C代码构建高效硬件