Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将QOpenGLFramebufferObject的内容绘制到QOpenGLWidget上_Opengl_Qt5 - Fatal编程技术网

将QOpenGLFramebufferObject的内容绘制到QOpenGLWidget上

将QOpenGLFramebufferObject的内容绘制到QOpenGLWidget上,opengl,qt5,Opengl,Qt5,我目前正在从Qt4移植到Qt5。虽然Qt5仍然提供QGLWidget等类,但这些类将被QOpenGLWidget等取代 目前我正在把复杂的东西画进一个帧缓冲区对象。然后我使用drawTexture()方法在屏幕上绘制它(到GL小部件中): target->drawTexture(rect, fb->texture()); 后来,我用其他临时的东西透支了。因此,每当我需要更新临时内容时,我可以重新使用帧缓冲区对象,而不是重新绘制复杂的内容 然而,对于QOpenGLWidget和QOp

我目前正在从Qt4移植到Qt5。虽然Qt5仍然提供QGLWidget等类,但这些类将被QOpenGLWidget等取代

目前我正在把复杂的东西画进一个帧缓冲区对象。然后我使用
drawTexture()
方法在屏幕上绘制它(到GL小部件中):

target->drawTexture(rect, fb->texture());
后来,我用其他临时的东西透支了。因此,每当我需要更新临时内容时,我可以重新使用帧缓冲区对象,而不是重新绘制复杂的内容

然而,对于QOpenGLWidget和QOpenGLContext,再也没有方便的
drawTexture()
方法了。用OpenGL手工绘制纹理至少需要20行复杂的东西。我承认,课本上的东西


是否有任何优雅的/Qt方式将我的fbo内容显示在屏幕上?例如,据文件记载,QOpenGLWidget还使用fbo作为后端。除了绘制纹理,我们还可以blit FBO。但是怎么做呢?

为了提高性能,您需要制作纹理四边形。这可能需要一点额外的工作来完成,但这是你写一次就可以永远重复使用的东西。另一种选择是
glBlitFramebuffer(…)
,虽然听起来使用专门为此构建的命令可以获得性能优势,但实际上通常会得到一个小的惩罚,我只使用
glBlitFramebuffer(…)
用于非常特殊的事情,如将renderbuffer对象或多采样缓冲区复制到单个采样输出中。如果您正在绘制纹理,最好的显示方式是绘制一个四边形。谢谢您提供的这些信息。到目前为止,我还使用blitting从多采样到常规缓冲区。我不知道它更贵,很好知道。为了性能,你会想要做纹理的四边形。这可能需要一点额外的工作来完成,但这是你写一次就可以永远重复使用的东西。另一种选择是
glBlitFramebuffer(…)
,虽然听起来使用专门为此构建的命令可以获得性能优势,但实际上通常会得到一个小的惩罚,我只使用
glBlitFramebuffer(…)
用于非常特殊的事情,如将renderbuffer对象或多采样缓冲区复制到单个采样输出中。如果您正在绘制纹理,最好的显示方式是绘制一个四边形。谢谢您提供的这些信息。到目前为止,我还使用blitting从多采样到常规缓冲区。我不知道它更贵,很高兴知道。