4

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

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

4

1 回答 1

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

于 2015-09-16T14:49:15.877 回答