是否可以在opengl中使用深度缓冲区渲染3D纹理

Posted

技术标签:

【中文标题】是否可以在opengl中使用深度缓冲区渲染3D纹理【英文标题】:Is it possible to render 3D texture with depth buffer in opengl 【发布时间】:2016-05-12 07:50:45 【问题描述】:

我正在尝试实现一些程序并使用这个经典代码:

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】:

如果一个附加图像是分层的,那么 所有 个附加图像必须是分层的。因此,如果您想使用深度缓冲区进行分层渲染,则深度图像必须是分层的。

因此,您应该使用具有深度格式的 2D 数组纹理,而不是使用渲染缓冲区。

【讨论】:

我不相信有深度格式的 3D 纹理。所以它必须是一个二维数组纹理。 @RetoKoradi:OpenGL API 对此没有限制。 有点太长,无法完整引用,但请查看 4.5 规范第 191 页的最后一段,从“基本内部格式为 DEPTH_COMPONENT 的纹理,...”开始。 @RetoKoradi:这是 4.5 的第 193 页。至少,在最新版本的规范中。 你能提供一个小例子如何初始化这样一个缓冲区(或者在这里放一些带有解释的url)。我期待一些东西,可以使用深度缓冲区渲染 3d 纹理,但同时,我不需要深度纹理本身,所以我会在渲染后丢弃它。

以上是关于是否可以在opengl中使用深度缓冲区渲染3D纹理的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL(FBO)中的普通后台缓冲区+渲染到深度纹理

在 OpenGL 中将深度渲染到纹理时出现奇怪的结果

使用帧缓冲区将深度缓冲区渲染到纹理中

深度缓冲区不使用多个着色器程序

在 OpenGL ES 中为帧缓冲区使用深度和模板渲染缓冲区附件

◮OpenGL-帧缓冲