OpenGL帧缓冲函数不能在单独的类中完全工作
OpenGL frame-buffer functions not fully working in separate class
我的问题:
当尝试在处理渲染循环的主类之外的单独类中执行帧缓冲区操作时,代码执行并注册一些函数,但最终操作的结果不呈现。
要绝对清楚,如果我复制我的预期渲染操作从一个单独的类(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"这样的变化显然不会发生在我的任何其他类中,除了处理我的渲染循环的类。
- 如何在C++中从两个单独的for循环中添加两个数组
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 用C++在单独的头文件中完成函数体
- 类模板的成员功能的定义在单独的TU中完全专业化
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 如何使用单独文件中的派生类访问友元函数对象
- CoInitialize()在单独的线程上崩溃而不返回
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 当在函数调用中递增值时,程序正常工作,但是如果我们在单独的行中增加值而不是呼叫函数,则会出现错误.为什么
- 如何创建一个在单独的方法中工作的c++随机正态分布
- #ifdef 单独的标头中,无法按预期工作
- C++选项定价函数..单独工作很好,但对于股票价格的范围(向量)来说不行
- 为什么在单独的函数中创建 ncurses 小部件时不能正常工作?
- OpenGL帧缓冲函数不能在单独的类中完全工作
- 当调用一个单独的android线程时,Emit不工作
- c++ /OpenGL: vao单独工作,但不能一起工作