当尝试在处理渲染循环的主要类之外的单独类中执行帧缓冲操作时,代码执行并且一些函数注册,但最终操作的结果不会呈现。
非常清楚,如果我将我想要的渲染操作复制到一个单独的类(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调用,这几乎使得该类没有实际意义......
答案 0 :(得分:3)
您描述的重构不应该影响结果,因为OpenGL只是一个C API,并且不关心您在其上执行的任何C ++包装,只要函数顺序相同并且参数是一样的。你确定两个版本的TARGET_FBO是一样的吗?您可以使用Apitrace捕获两个版本的跟踪并进行比较。我怀疑会出现一些可以解释失败的差异。
答案 1 :(得分:0)
我缩小了从提供的" QOpenGLWidget"以外的地方使用哪些功能不起作用?看来,只要我在主QOpenGLWidget类中绑定默认帧缓冲区,那么一切都很好。
那一行
glBindFramebuffer(GL_FRAMEBUFFER,defaultFramebufferObject());
或任何变体,例如使用" 0"显然不会发生在我的任何其他类中,除了处理渲染循环的那个。
这很容易处理。