是否可以在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纹理的主要内容,如果未能解决你的问题,请参考以下文章