我对CUDA很新,但我已经设法使用OpenGL在屏幕上显示内核生成的内容。我尝试了几种方法:
所有这些都有效,但是,在实施#2时,我错误地将提示设置为cudaGraphicsRegisterFlagsWriteDiscard。由于所有数据都将由CUDA生成,我认为这是正确的选择。然而,后来我意识到我需要一个CUDA表面来写入OpenGL纹理,当你使用表面时,你被要求使用LoadStore标志。
基本上我的问题是这样的:因为我绝对需要一个CUDA表面来写入CUDA中的OpenGL纹理,cudaGraphicsRegisterFlagsWriteDiscard在cudaGraphicsGLRegisterImage中的用例是什么?
答案 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()
中的操作序列。