我有以下场景:
我有自定义的 FBO,其纹理作为颜色附件。我将我的东西渲染到该 FBO 中。下一步我需要与 CUDA 共享该纹理,然后在其上运行一些后处理内核。之后,纹理应该绑定回全屏四边形并渲染到默认帧缓冲区。
我读过了几个 OpenGL / CUDA 互操作教程 http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/Graphics_Interop.html我并不完全清楚这样做的一些步骤。
首先,我看到他们通常做的是从 GL 纹理 X 读取数据,在 CUDA 中处理它,然后使用 PBO 用结果数据填充纹理 Y。
我注意到的另一件事(如果我错了请纠正我)是这些演示中的 OpenGL 默认使用 PBO 绑定,这意味着第一遍渲染结果存储在其中?我真的不确定这一点,因为所有这些演示都使用固定的 OpenGL,并且在渲染初始几何通道时,我没有看到 PBO 被绑定的地方。
回到我的案例:
我的最后一个问题是——我可以直接在 CUDA 中操作 OpenGL 纹理而不使用 PBO,以便我可以在 CUDA 内核中修改它吗?
如果不是,那么这是否意味着我必须先将 FBO 纹理打包到 PBO 中,然后再将其传递到 CUDA 阶段?
UPDATE:
从帧缓冲区填充 PBO 通常是使用 glReadPixels() 完成的,这意味着它被下载到 CPU。这是我想防止的事情。 - 这是错误的假设。那么基于这样的事实,我可以用纹理中的像素填充 PBO,下面的方法是什么呢? :
用纹理数据填充 PBO。
将其映射到 CUDA 缓冲区资源。
使用内核更改数据。
从修改后的 PBO 更新目标纹理。
在 OpenGL 中使用更新后的纹理。
下面是在 CUDA 中处理“OpenGL 纹理”然后立即在 OpenGL 中使用它而无需额外开销的示例:
https://github.com/nvpro-samples/gl_cuda_interop_pingpong_st https://github.com/nvpro-samples/gl_cuda_interop_pingpong_st
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)