【问题标题】:Depth testing doesn't work when using custom framebuffer使用自定义帧缓冲区时深度测试不起作用
【发布时间】:2018-06-22 16:33:15
【问题描述】:

我正在整理帧缓冲区,并在我的场景中制作了一面镜子。除了深度测试外,它工作正常。被卡住试图让它工作。 (当渲染到默认帧缓冲区时 - 深度测试工作正常)。将不胜感激任何帮助。这是代码:

glEnable( GL_DEPTH_TEST );

glViewport( 0, 0, 512, 512 );

unsigned int fbo;
glGenFramebuffers( 1, &fbo );
glBindFramebuffer( GL_FRAMEBUFFER, fbo );

unsigned int rbo;
glGenRenderbuffers( 1, &rbo );
glBindRenderbuffer( GL_RENDERBUFFER, rbo );
glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH, 512, 512 );
glBindRenderbuffer( GL_RENDERBUFFER, 0 );

glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 
GL_RENDERBUFFER, rbo ); //if remove this, mirror works but without depth test
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 
this->mirror->texturePack[0]->textureId(), 0 ); 

//render scene from mirror camera

glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glViewport( 0, 0, this->width(), this->height() );

//render scene from main camera

【问题讨论】:

  • 是的,我做到了,它通过了检查。
  • 你确定吗?我测试了代码,但失败了。但是,如果我将 GL_DEPTH 更改为 GL_DEPTH_COMPONENT32 它就可以了。
  • 是的,我也将 GL_DEPTH 更改为 GL_DEPTH_COMPONENT32,否则它不会通过此检查。但是我的镜子还是不行。我也试过 DEPTH_COMPONENT16、DEPTH_COMPONENT24,也没有帮助。可能是错误出现在我的渲染代码中..
  • 问题的代码sn-p没问题(GL_DEPTH除外)。所以问题出在其他地方。

标签: c++ opengl framebuffer depth-testing qopenglfunctions


【解决方案1】:

您的农场缓冲区不完整,因为GL_DEPTH 不是渲染缓冲区存储的有效内部格式。 见glRenderbufferStorage。试试GL_DEPTH_COMPONENT16GL_DEPTH_COMPONENT24GL_DEPTH_COMPONENT32

glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 512, 512 );

OpenGL 4.6 core profile specification, 9.4 Framebuffer Completeness, page 323:

所附图片的内部格式会影响图片的完整性 帧缓冲区,所以首先定义内部之间的关系很有用 图像的格式以及它可以附加到的附件点。

• 如果内部格式为 DEPTH_COMPONENT 或 1,则它是可深度渲染的 表 8.13 中基本内部格式为 DEPTH_- 的格式 COMPONENT 或 DEPTH_STENCIL。没有其他格式可以进行深度渲染。


注意,可以通过以下方式检查帧缓冲区的完整性:

glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE

【讨论】:

  • 谢谢!我试过 DEPTH_COMPONENT16、DEPTH_COMPONENT24 或 DEPTH_COMPONENT32,它通过了 glCheckFramebufferStatus 检查,但仍然没有显示镜像纹理。
【解决方案2】:

我终于解决了。我在绑定镜像帧缓冲区之后立即添加了 glClear( GL_DEPTH_BUFFER_BIT ) 命令,之后它就起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多