0

我对 CUDA 很陌生,但我已经设法使用 OpenGL 在屏幕上显示内核生成的内容。我尝试了几种方法:

  1. 使用 PBO 和 OpenGL 纹理(旧式);
  2. 使用 OpenGL 纹理作为 CUDA 表面并在四边形上进行渲染(新样式);
  3. 使用渲染缓冲区作为 CUDA 表面并使用 glBlitFramebuffer 进行渲染。

所有这些都有效,但是,在实现 #2 时,我错误地将提示设置为 cudaGraphicsRegisterFlagsWriteDiscard。由于所有数据都将由 CUDA 生成,我认为这是正确的选择。但是,后来我意识到我需要一个 CUDA 表面来写入 OpenGL 纹理,并且当您使用表面时,您需要使用 LoadStore 标志。

所以基本上我的问题是:由于我绝对需要一个 CUDA 表面来写入 CUDA 中的 OpenGL 纹理,那么 cudaGraphicsRegisterFlagsWriteDiscard 在 cudaGraphicsGLRegisterImage 中的用例是什么?

4

1 回答 1

1

文档描述看起来很简单。它用于将数据从 CUDA 单向传递到 OpenGL。

这本在线书籍摘录提供了类似的解释:

以 CUDA 为生产者而 OpenGL 为消费者的应用程序应使用 write-discard 标志注册对象...

如果您想查看示例,请查看postProcessGL cuda 示例。在这种情况下,OpenGL 正在渲染图像,并且在显示之前由 cuda 对其进行后处理(添加模糊)。在这种情况下,数据流有两种不同的路径。在 OpenGL->CUDA 的情况下,数据由createTextureSrc函数处理,指定的标志是只读的。对于 CUDA->OpenGL 情况(交付后处理的帧),函数在 中处理createTextureDst,其中使用指定cudaGraphicsGLRegisterImagecudaGraphicsMapFlagsWriteDiscard标志进行调用,因为在此路径上,CUDA 正在生产,而 OpenGL 正在消费。

要了解如何处理纹理(通过 a 填充来自 cuda 操作的数据cudaArray),您可能需要研究processImage().

于 2013-05-28T03:04:29.653 回答