Cuda Render Buffer Interop用于深度组件

时间:2013-01-31 15:33:09

标签: opengl cuda fbo depth-buffer

我要做的是使用OpenGL执行一些渲染,然后使用CUDA直接对渲染的RGB和深度组件执行一些只读后处理(计算),而不将数据复制到PBO。

为此,我创建了一个FBO,并为其附加了两个RBO(一个用于RGBA,另一个用于DEPTH)。

然后,我使用GL_RENDERBUFFER作为参数为每个RBO调用cudaGraphicsGLRegisterImage。对于颜色RBO cudaGraphicsGLRegisterImage返回cudaSuccess,但对于深度RBO,我收到一个cudaErrorInvalidValue。

我在论坛的某个地方读到过nvidia目前不支持CUDA为深度组件渲染缓冲区互操作,尽管它在文档中很好地存在。

我使用的是CUDA Toolkit 5.0,我有一张Quadro 2000卡。

有人成功完成了这项工作吗?

以下是一些代码摘录:

glGenRenderbuffers(1, &rbo_color);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_color);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, WIDTH, HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

if (cudaGraphicsGLRegisterImage(&resource_color, rbo_color, GL_RENDERBUFFER, cudaGraphicsMapFlagsReadOnly) != cudaSuccess)
    fprintf(stderr, "Error in registering rbo color with cuda\n");

glGenRenderbuffers(1, &rbo_depth);
glBindRenderbuffer(GL_RENDERBUFFER, rbo_depth);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, WIDTH, HEIGHT);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

if (cudaGraphicsGLRegisterImage(&resource_depth, rbo_depth, GL_RENDERBUFFER, cudaGraphicsMapFlagsReadOnly) != cudaSuccess)
    fprintf(stderr, "Error in registering rbo depth with cuda\n");

1 个答案:

答案 0 :(得分:3)

我没有成功绑定深度缓冲区本身。解决此问题的方法是将深度像素值渲染到颜色缓冲区中,然后像这样绑定颜色缓冲区。您需要编写自己的着色器才能完成此任务。

相关问题