Opengl深度缓冲到cuda

时间:2015-09-16 14:08:53

标签: opengl cuda depth-buffer zbuffer

我是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。

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

以下是文章的引用:

  

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

陈述是否仍然正确? 您建议我将深度缓冲区转储到颜色通道? 纹理?

1 个答案:

答案 0 :(得分:2)

是的,不是。问题是,当他们绑定到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