gpt4 book ai didi

OpenGL FBO 不发送深度缓冲区

转载 作者:行者123 更新时间:2023-12-04 12:52:35 27 4
gpt4 key购买 nike

我正在尝试创建一个 FBO 来绘制 3D 场景,并创建另一个 FBO 来绘制 HUD。然后,我尝试通过将 3D 场景 block 传输到默认 FBO,然后将 HUD block 传输到默认 FBO,来组合这两个 FBO。

创建的每个 FBO 都具有与窗口相同的尺寸,并且具有用于颜色附件和深度附件的 RBO。

我期望发生的是 3D FBO 的 blit 将在绘制 3D 彩色 RBO 的内容时使用来自 3D 深度 RBO 的数据填充默认 FBO 的深度缓冲区。然后第二个 blit,HUD,会将 HUD 颜色 RBO 数据绘制到默认 FBO 中,其中 HUD 深度 RBO 是默认 FBO 的深度数据 GL_LEQUAL。

Side Note

I understand that what I probably want is to clear the HUD with a color that has no alpha (currently I clear with <1.0f, 0.0f, 1.0f, 0.0f>) and then disable depth test and blit the HUD to the default FBO. This would make sure that the HUD is always on top. I intend to do this, but I need to make the depth check version work first.

当前正在发生的事情是 3D FBO 绘制到场景,然后 HUD FBO 完全绘制在场景上。背景应该有透明清晰颜色的地方也不清晰。他们绘制 3D 场景以完全覆盖它。

我是否遗漏了什么或不理解 FBO block 传输?是否有可能深度检查工作正常,但没有混合清晰的颜色 alpha channel ?

可以在此处找到单个帧的 OpenGL 调用日志:
http://fpaste.org/84040/

计划详情

  • OpenGL 上下文版本:4.0
  • GLX 窗口色彩空间:RGBA8
  • GLX 窗口深度尺寸:24
  • GLX 窗口模板尺寸:8

开发系统详情

  • 操作系统:Ubuntu 12.04 LTS
  • 显卡:ATI Radeon HD 5750
  • 驱动版本:13.25.5

比特代码

public void blit(int dstX = 0, int dstY = 0,
int dstWidth = 0, int dstHeight = 0,
uint targetFrameBuffer = 0)
{
int mask;

// Start out with nothing set.
mask = 0;

// See if we should blit the color buffer.
if (color_buffer != null)
{
mask |= GL_COLOR_BUFFER_BIT;
}

// See if we should blit the depth buffer.
if (depth_buffer != null)
{
mask |= GL_DEPTH_BUFFER_BIT;
}

// See if we should blit the stencil buffer.
if (stencil_buffer != null)
{
mask |= GL_STENCIL_BUFFER_BIT;
}

// Make sure some mask was set before anything is done.
if (mask != 0)
{
// Enable depth writing if a depth buffer is available.
if (depth_buffer != null)
{
// Enable depth writing.
glDepthMask(GL_TRUE);
}

// Bind the reading and drawing buffers.
glBindFramebuffer(GL_READ_FRAMEBUFFER, reference);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, targetFrameBuffer);

// If the target buffer is the default FBO,
// then render to the back one.
if (targetFrameBuffer == 0)
{
glDrawBuffer(GL_BACK);
}

glBlitFramebuffer(0, 0, width, height,
dstX, dstY, dstWidth, dstHeight,
mask, GL_NEAREST);

// Unbind the buffers.
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

// Disable depth writing if it was enabled earlier.
if (depth_buffer != null)
{
// Disable depth writing.
glDepthMask(GL_FALSE);
}
}
}

最佳答案

glBlitFramebuffer 只是将一个像素 block 从一个缓冲区复制到另一个缓冲区。它不使用深度缓冲区来接受或拒绝来自源缓冲区的像素。

您可以通过使用 HUD 纹理和深度缓冲区绘制四边形来做您想做的事情(假设您将深度纹理绑定(bind)到 HUD FBO)。您需要将深度纹理的值写入片段着色器中的 gl_FragDepth。

如果您改为使用 alpha(正如您所说的那样),则同样如此,只是您将仅使用 HUD FBO 的 alpha 值进行混合。这是更好的解决方案,因为它取消了 HUD 深度缓冲区。

关于OpenGL FBO 不发送深度缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com