【问题标题】:Opengl depth buffer to cudaOpengl深度缓冲区到cuda
【发布时间】:2015-12-13 04:21:58
【问题描述】:

我是 Opengl 的新程序员, 我的目标是将深度缓冲区检索到 FBO 中,以便能够在不使用 glReadpixels 的情况下传输到 cuda。

这是我已经完成的:

void make_Fbo()
{

    glGenFramebuffers(1, &fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                               GL_DEPTH_ATTACHMENT,
                           GL_RENDERBUFFER,
                                           fbo);
    check_gl_error("make_fbo");
}


void make_render_buffer()
{
    glGenRenderbuffers(1, &rb);
    glBindRenderbuffer(GL_RENDERBUFFER, rb);
    glRenderbufferStorage(GL_RENDERBUFFER,
                          GL_DEPTH_COMPONENT,
                               win.width,
                               win.height);
    check_gl_error("make render_buffer");
}

此代码使用正确的深度值创建我的 FBO。

现在出现了一个新问题,根据文章“使用不规则 z-buffer 在 cuda 上的快速三角形光栅化” 无法从 Cuda 访问附加到 FBO 的深度缓冲区。

这是文章的引用:

纹理或渲染缓冲区可以附加到深度 FBO 的附着点以适应深度值。然而,就 我们已经测试过,它们不能被 CUDA 内核访问。 [...] 我们设法使用了 FBO 上的颜色附着点。显然 在这种情况下,我们必须编写一个简单的着色器程序来将深度值转储到 帧缓冲区的颜色通道。根据 GLSL 规范 [KBR06], 特殊变量 gl_FragCoord

这些陈述仍然正确吗? 你建议我将深度缓冲区转储到颜色通道吗? 到纹理?

【问题讨论】:

    标签: opengl cuda depth-buffer zbuffer


    【解决方案1】:

    嗯,是的,不是的。问题是当它们绑定到 FBO 时,您无法访问 CUDA 中的资源。

    据我了解,使用 cudaGraphicsGLRegisterImage() 您可以启用 cuda 访问任何类型的图像数据。因此,如果您使用作为渲染目标且未绑定到 FBO 的深度缓冲区,则可以使用它。

    这里是 cuda API 信息:

    https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__OPENGL.html#group__CUDART__OPENGL_1g80d12187ae7590807c7676697d9fe03d

    在这篇文章中,他们解释说您应该循环或双缓冲深度缓冲区,或者在 CUDA 中使用数据之前复制数据(但您或多或少地放弃了互操作的整个想法)。

    http://codekea.com/xLj7d1ya5gD6/modifying-opengl-fbo-texture-attachment-in-cuda.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多