【问题标题】:How to display pixel arrays in GPU global memory onto screen directly?如何将 GPU 全局内存中的像素数组直接显示到屏幕上?
【发布时间】:2013-03-17 04:30:11
【问题描述】:

我在 GPU 上做一个路径跟踪器,我在 GPU 全局内存上得到了一些像素数据(这是一个 float3 数组)的跟踪结果,我在屏幕上显示数组的方法是将数组复制到CPU内存和调用OpenGLglTexImage2D

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixelArray);

然后显示纹理。 pixelArray 是要显示的像素数据数组。由于 GPU 是管理整个渲染过程的设备,有没有办法在屏幕上显示pixelArray 而无需将数据从 GPU 复制到 CPU?

【问题讨论】:

  • “彩色像素阵列”到底是什么意思?你说的是一个存储像素数据的 OpenGL 缓冲区对象,一块存储像素数据的 CUDA 内存,还是什么?
  • 这只是一个 float3 (RGBcolor) 类型的数组,它存储在 GPU 全局内存中。 @NicolBolas
  • 对,但您将其标记为 OpenGL 和 CUDA。它们中的每一个都有自己的、独立的方式来在 GPU 全局内存中存储数据数组。您使用的方式将影响您将其粘贴到纹理中的选项。那么它是什么?
  • 我们可以忘记 OpenGL。像素数据确实存在于像 [(R,G,B),(R,G,B),...,(R,G,B)] 这样的 cuda 全局内存中,可以将这样的数组直接放到屏幕上,而无需涉及 CPU会减少开销。 @NicolBolas
  • @Tony:不,我们不能忘记 OpenGL。 CUDA 具有图形和 OpenGL 互操作性。您可以将 OpenGL 纹理映射为 CUDA 全局内存数组。要么将数据直接写入映射纹理,要么将 cudaMemcpy2D 写入纹理映射。

标签: opengl cuda gpu


【解决方案1】:

使用 CUDA OpenGL 图形互操作将 OpenGL 纹理映射为 CUDA 全局内存。将数据直接写入纹理或使用 cudaMemcpy2D。

【讨论】:

    【解决方案2】:

    Here is a function我做了一次,用于渲染数据驻留在GPU全局内存中的图像。 您将需要 freeglutglew 以及 CUDA 来运行它。目前它仅适用于 Windows。

    我仍然使用这个函数来渲染 GPU 图像。只需拨打ShowRawImage 即可完成。

    它的唯一开销是从全局内存到 OpenGL 设备缓冲区的内存复制。但它更好,因为它是设备到设备的复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多