【问题标题】:Cuda Render Buffer Interop for depth component深度组件的 Cuda 渲染缓冲区互操作
【发布时间】:2013-01-15 18:21:28
【问题描述】:

我要做的是使用 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");

【问题讨论】:

    标签: opengl cuda fbo depth-buffer


    【解决方案1】:

    我没有成功绑定深度缓冲区本身。一种解决方法是将深度像素值渲染到颜色缓冲区中,并像您一样绑定颜色缓冲区。您将需要编写自己的着色器来完成此操作。

    【讨论】:

    • 像魅力一样工作!因为我不必复制数据,所以性能有了很大的提高。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多