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

时间:2016-05-12 07:50:46

标签: c++ opengl 3d

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

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 :(得分:1)

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

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