OpenGL帧缓冲区函数不能在单独的类

时间:2015-09-08 03:31:43

标签: c++ qt opengl rendering framebuffer

我的问题:

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

非常清楚,如果我将我想要的渲染操作复制到一个单独的类(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);

我的渲染类扩展了我的一类Called DFuncShader,它包含一个着色器程序并扩展了QOpenGLFunctions_4_3_Core。我已经为其他几个类做了这个并没有注意到任何问题,但是之前他们都没有对帧缓冲区做过任何事情,它们主要只是处理着色器操作。

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我缩小了从提供的" QOpenGLWidget"以外的地方使用哪些功能不起作用?看来,只要我在主QOpenGLWidget类中绑定默认帧缓冲区,那么一切都很好。

那一行

  

glBindFramebuffer(GL_FRAMEBUFFER,defaultFramebufferObject());

或任何变体,例如使用" 0"显然不会发生在我的任何其他类中,除了处理渲染循环的那个。

这很容易处理。