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

OpenGL frame-buffer functions not fully working in separate class

本文关键字:工作 单独 缓冲 函数 不能 OpenGL      更新时间:2023-10-16

我的问题:

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

要绝对清楚,如果我复制我的预期渲染操作从一个单独的类(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。我一直在为其他几个类这样做,并没有注意到任何问题,但是他们都没有做任何与帧缓冲区之前,他们都主要只是处理着色器操作。

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

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

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

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

那一行

glBindFramebuffer (GL_FRAMEBUFFER defaultFramebufferObject ());

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