Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
到cuda的Opengl深度缓冲区_Opengl_Cuda_Depth Buffer_Zbuffer - Fatal编程技术网

到cuda的Opengl深度缓冲区

到cuda的Opengl深度缓冲区,opengl,cuda,depth-buffer,zbuffer,Opengl,Cuda,Depth Buffer,Zbuffer,我是Opengl的新程序员, 我的目标是将深度缓冲区检索到FBO中,以便能够在不使用glReadpixels的情况下传输到cuda 以下是我已经做过的: void make_Fbo() { glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); glFramebufferRenderbuffer(GL_FRAMEBUFFER,

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

这些说法仍然正确吗? 您建议我如何将深度缓冲区转储到颜色通道?
到纹理?

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

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

以下是cuda API信息:

在本文中,他们解释说,您应该循环使用深度缓冲区或将深度缓冲区加倍缓冲,或者在CUDA中使用数据之前复制数据(但是您或多或少会放弃互操作的整个概念)