2016-05-12 153 views
0

我试图执行一些程序并使用这个经典代码:是否可以渲染3D纹理深度缓冲OpenGL中

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 

绑定深度缓冲。

glGenRenderbuffers(1, &depthbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, 
height); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuffer); 

绑定几个3D纹理:

glGenTextures(targets.size(), textures); 
for (auto &target : targets) { 
    glBindTexture(GL_TEXTURE_3D, textures[ix]); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32F, width, height, depth, 0, GL_RGBA, GL_FLOAT, NULL); 
} 
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + ix, textures[ix], 0); 
    buffers[ix] = GL_COLOR_ATTACHMENT0 + ix; 
    ++ix; 
} 
glDrawBuffers(targets.size(), buffers); 

而且它不工作,这表明GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS错误。我认为,因为我的纹理是分层的,所以没有分层深度缓冲区可能会有问题。我用与3D纹理相同的方式创建了它,所以我删除了深度缓冲区。这个解决的任务,现在我的帧缓冲区正在工作,渲染完成等。

但是如果我需要渲染每个图层并附加了深度缓冲区,该怎么办?是否支持这种功能,是否有一些很少API调用来实现这一点?

回答

1

如果一个附加图像是分层的,那么所有附加的图像必须分层。所以如果你想用深度缓冲区进行分层渲染,深度图像必须也是分层。

因此,不应使用渲染缓冲区,而应使用深度格式的二维数组纹理。

+0

我不相信有深度格式的3D纹理。所以它必须是二维数组纹理。 –

+0

@ReetoKoradi:在OpenGL API中没有限制。 –

+0

有点太长,以至于不能完整引用此处,但请检查4.5规范的第191页上的最后一段,从“基本内部格式为DEPTH_COMPONENT的纹理...”开始。 –