我对 CUDA 相当陌生,但我已经设法使用 OpenGL 在屏幕上显示内核生成的内容。我尝试了几种方法:
- 使用 PBO 和 OpenGL 纹理(旧式);
- 使用 OpenGL 纹理作为 CUDA 表面并在四边形上渲染(新样式);
- 使用渲染缓冲区作为 CUDA 表面并使用 glBlitFramebuffer 进行渲染。
所有这些都有效,但是,在实现 #2 时,我错误地将提示设置为 cudaGraphicsRegisterFlagsWriteDiscard。由于所有数据都将由 CUDA 生成,我认为这是正确的选择。然而,后来我意识到我需要一个 CUDA 表面来写入 OpenGL 纹理,并且当您使用表面时,需要使用 LoadStore 标志。
所以基本上我的问题是这样的:由于我绝对需要一个 CUDA 表面来写入 CUDA 中的 OpenGL 纹理,所以 cudaGraphicsRegisterFlagsWriteDiscard 在 cudaGraphicsGLRegisterImage 中的用例是什么?
The 文档说明 http://docs.nvidia.com/cuda/cuda-runtime-api/index.html#group__CUDART__OPENGL_1gd7be3ca8a7a739d57f0b558562c5706e看起来很简单。它用于从 CUDA 到 OpenGL 的单向数据传输。
This 提供了类似的解释:
CUDA 是生产者而 OpenGL 是消费者的应用程序应该使用写入丢弃标志注册对象......
如果您想查看示例,请查看后处理GL http://docs.nvidia.com/cuda/cuda-samples/index.html#post-process-in-openglCUDA样本。在这种情况下,OpenGL 正在渲染图像,并且在显示之前由 cuda 对其进行后处理(添加模糊)。在这种情况下,数据流有两条独立的路径。在 OpenGL->CUDA 情况下,数据由createTextureSrc
函数,并且指定的标志是只读的。对于 CUDA->OpenGL 情况(交付后处理帧),该函数在createTextureDst
,其中调用cudaGraphicsGLRegisterImage
与cudaGraphicsMapFlagsWriteDiscard
指定标志,因为在此路径上,CUDA 正在生成而 OpenGL 正在消耗。
了解如何处理纹理(通过 cuda 操作填充数据)cudaArray
)你可能想研究其中的操作顺序processImage()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)