【问题标题】:Draw Direct To Screen With CUDA/OPENCL使用 CUDA/OPENCL 直接在屏幕上绘制
【发布时间】:2014-01-18 02:10:31
【问题描述】:

是否有可能使用任何现有的 API(opengl、directx 等)直接将 CUDA/OPENCL 结果绘制到屏幕上?跳过典型的绘制纹理四边形方法。

即使注册资源并使用现代 CUDA 互操作方法,我们仍然必须遍历整个渲染管道才能渲染一组颜色。对于像我这样每毫秒都很重要的应用程序,这是一个问题。

【问题讨论】:

  • 我非常怀疑。 CUDA/OpenCL 不挂钩到光栅化管道。您不仅需要管道,还需要一个由操作系统连接的句柄(在带有客户端/服务器模型的 openGL 中)编辑:“opencl 1.1 现在允许与 opencl 代码共享 opengl 上下文”,但它仍然需要通过 openGL 进行初始化
  • 没有独立于平台的方式来做到这一点。但是,您也许可以做一些在实践中有效的东西。您能否提供有关您在哪种平台上开发的任何详细信息?
  • 我一直想知道是否有一种方法可以修改开源驱动程序,以便为我提供某种类型的句柄以在 Linux 上使用,但现在我还没有想到。而且我更喜欢使用 Nvidia 卡
  • 我同意,您不会在任何现代操作系统中看到此功能。但是,您可以想象在嵌入式情况下看到它,您可以将帧缓冲区地址传递给可以直接写入它的内核。现在不太可能,即使是手机也使用 OpenGL 之类的东西进行 UI 合成。最好的办法是写入纹理,然后使用操作系统或 OpenGL 函数来绘制它(或使其成为场景图的一部分)。

标签: opengl cuda directx opencl


【解决方案1】:

使用 OpenCL 或 CUDA 无法直接在屏幕上绘图。

这是一个可以解决的问题,但据我所知,NVIDIA 没有提供所需的 API,因为它们的实现和使用都非常复杂,而且性能优势充其量也是有限的。

两个主要问题是:

1) 用于渲染的缓冲区的不同布局(即您必须使用表面加载/存储功能 - 映射到 CUDA 的地址空间不适合图形,因为间距线性布局在这方面的性能很差上下文)和

2) 将 CUDA/OpenCL 输出合并到演示模型中的特定于平台的详细信息(无论是桌面还是翻页全屏体验,如 Direct3D 游戏,或者将应用程序的输出合并到桌面) .请记住,如今大多数桌面本身都是翻页的,因此无论如何都不赞成在前端缓冲区上乱涂乱画。

【讨论】:

    【解决方案2】:

    我非常怀疑使用带纹理的四边形绘制像素是否会损失任何性能,但您可以使用 glDrawPixels 直接在帧缓冲区上绘制像素。

    【讨论】:

    • 我已经尝试了这两种方法,我记得绘制带纹理的四边形比调用 glDrawPixels 快得多。直觉上,人们可能会期望(和我一样)直接在 2D 中绘制应该更快,但我猜 GPU 硬件已经针对 3D 进行了高度优化,以至于这种期望在实践中并不成立。
    • @evenex_code:这不是它变慢的真正原因。原因是 GPU 停止执行该写入。还有一个从 RAM 到 VRAM 的内存传输来绘制这些像素,这非常慢。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多