cudaGraphicsGLRegisterImage中cudaGraphicsRegisterFlagsWriteDiscard的用例是什么?

时间:2013-05-27 03:21:36

标签: opengl cuda

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

  1. 使用PBO和OpenGL纹理(旧样式);
  2. 将OpenGL纹理用作CUDA曲面并在四边形(新样式)上渲染;
  3. 使用渲染缓冲区作为CUDA曲面并使用glBlitFramebuffer进行渲染。
  4. 所有这些都有效,但是,在实施#2时,我错误地将提示设置为cudaGraphicsRegisterFlagsWriteDiscard。由于所有数据都将由CUDA生成,我认为这是正确的选择。然而,后来我意识到我需要一个CUDA表面来写入OpenGL纹理,当你使用表面时,你被要求使用LoadStore标志。

    基本上我的问题是这样的:因为我绝对需要一个CUDA表面来写入CUDA中的OpenGL纹理,cudaGraphicsRegisterFlagsWriteDiscard在cudaGraphicsGLRegisterImage中的用例是什么?

1 个答案:

答案 0 :(得分:1)

documentation description似乎很简单。它用于将数据从CUDA单向传送到OpenGL。

online book excerpt提供了类似的解释:

  

CUDA是生产者的应用程序和OpenGL是消费者应该使用写入丢弃标志注册对象......

如果您想查看示例,请查看postProcessGL cuda示例。在这种情况下,OpenGL正在渲染图像,并且在显示之前由cuda进行后处理(模糊添加)。在这种情况下,有两个单独的数据流路径。在OpenGL-> CUDA情况下,数据由createTextureSrc函数处理,指定的标志是只读的。对于CUDA-> OpenGL情况(传递后处理帧),该函数在createTextureDst中处理,其中调用cudaGraphicsGLRegisterImage并指定cudaGraphicsMapFlagsWriteDiscard标志,因为在这条道路上,CUDA正在生产,OpenGL正在消耗。

要了解如何处理纹理(通过cudaArray填充来自cuda操作的数据),您可能希望研究processImage()中的操作序列。