我是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
陈述是否仍然正确? 您建议我将深度缓冲区转储到颜色通道? 纹理?
答案 0 :(得分:2)
是的,不是。问题是,当他们绑定到FBO时,您无法访问CUDA中的资源。
根据我的理解,使用cudaGraphicsGLRegisterImage()
启用cuda访问任何类型的图像数据。因此,如果您使用深度缓冲区作为渲染目标并且未绑定到FBO,则可以使用它。
以下是cuda API信息:
在本文中,他们解释了你应该对深度缓冲区进行循环或双缓冲,或者在CUDA中使用它之前复制数据(但是你或多或少会使整个互操作的想法无效)。
http://codekea.com/xLj7d1ya5gD6/modifying-opengl-fbo-texture-attachment-in-cuda.html