OpenGL 帧缓冲函数不能在单独的类中完全工作

Posted

技术标签:

【中文标题】OpenGL 帧缓冲函数不能在单独的类中完全工作【英文标题】:OpenGL frame-buffer functions not fully working in separate class 【发布时间】:2015-09-08 03:31:43 【问题描述】:

我的问题:

当尝试在处理我的渲染循环的主类之外的单独类中执行帧缓冲区操作时,代码会执行并且一些函数会注册,但最终操作的结果不会呈现。

绝对清楚,如果我将预期的渲染操作从一个单独的类 (GBuffer) 中复制出来并将其合并到我的主渲染类中,那么一切正常。

如果这恰好是一个错误的问题,另一个问题是“我如何在 QOpenGLWidget 类之外执行渲染操作?”

详情:

在我的渲染循环中,我可以执行以下操作并将场景渲染到我的屏幕上:

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, TARGET_FBO);
glDrawBuffer(GL_COLOR_ATTACHMENT4);
glClear(GL_COLOR_BUFFER_BIT);

RenderPass();

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, TARGET_FBO);
glReadBuffer(GL_COLOR_ATTACHMENT4);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

但是,如果我将渲染传递之前和之后的行移动到单独的类中,例如 GBuffer,代码将运行,但不会渲染:

GBuffer.StartFrame();

RenderPass();

GBuffer.FinalPass();
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_LINEAR);

我的渲染类扩展了我的一个名为 DFuncShader 的类,它包含一个着色器程序并扩展了 QOpenGLFunctions_4_3_Core。我一直在为其他几个类执行此操作,并没有发现任何问题,但是他们之前都没有对帧缓冲区做过任何事情,它们都主要只是处理着色器操作。

唯一的区别是我的 Rendering 类也继承自 QOpenGLWidget。

我能想到的唯一解决方案是在我的 GBuffer 类中添加一个指向我的主渲染类的指针,并使用该指针附加所有 OpenGL 调用,这几乎使该类没有实际意义...

【问题讨论】:

【参考方案1】:

您描述的重构不应影响结果,因为 OpenGL 只是一个 C API,并不关心您在其之上执行的任何 C++ 包装,只要函数顺序相同且参数是相同。您确定两个版本中的 TARGET_FBO 相同吗?您可以使用两个版本的 Apitrace 捕获跟踪并进行比较。我怀疑会出现一些可以解释失败的差异。

【讨论】:

是的,我确定,我直接把全班都抄过来了。今天早上,或者更确切地说是刚刚,我检查了我可以保留哪些行以及可以移回哪些行,我发现唯一不起作用的调用是绑定默认帧缓冲区的调用,当在外部完成时我的主要渲染类。【参考方案2】:

我缩小了从提供的“QOpenGLWidget”类外部使用时哪些函数不起作用的范围,并且似乎只要我在我的主 QOpenGLWidget 类中绑定默认帧缓冲区,那么一切都很好。

那一行

glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject());

或者像使用“0”这样的任何变化显然不会发生在我的任何其他类中,除了处理我的渲染循环的那个。

这很容易处理。

【讨论】:

以上是关于OpenGL 帧缓冲函数不能在单独的类中完全工作的主要内容,如果未能解决你的问题,请参考以下文章

iOS OpenGL ES Analyzer 列出“不存在的帧缓冲区附件”和“缺少帧缓冲区附件”,但 FBO 工作

着色器处理后读/写 OpenGL 3.2+ 帧缓冲区

OpenGL 帧缓冲区缺失面

Qt OpenGL帧缓冲区到图像

来自 glClear() 的 OpenGL 帧缓冲区错误

OpenGL 显示空白屏幕