用户界面-如何重新绘制只有一个无效的OpenGL上下文的一部分?(用于2D GUI渲染)



我使用OpenGL来优化GUI渲染。当渲染整个场景时,它工作得很好,但这不是最佳的,因为通常只有一小部分被改变。所以我试着这样做:

    glReadBuffer (GL_FRONT);
    glDrawBuffer (GL_BACK);
    glCopyPixels (0, 0, sz.X, sz.Y, GL_COLOR);
    glFlush();

这应该复制前缓冲区到后缓冲区,这样之后我可以改变只是部分限制使用glViewport。不幸的是,当一个场景被改变时,看起来glCopyPixels命令是在实际渲染之后执行的,因此原始内容与新图形混合在一起。

怎么了?还是有更好的方法?(为了记录,当我什么都不做时,前缓冲区开始与后缓冲区和类似的东西一起闪烁…)

但这不是最优的

你为什么那么想?OpenGL和现代gpu的设计基础是,在最坏的情况下,你必须重新绘制整个东西,在这种情况下,东西也应该表现良好。

或者有更好的方法来做到这一点?

是:重画整个场景。(或者我下面的建议)

对于一个现代的低端GPU来说,它可以很容易地将每秒数千万个三角形投射到屏幕上,而2D GUI的几百到一千个三角形是可以忽略不计的。

事实上,你的复制操作可能会比重新绘制所有内容更严重地影响性能,因为从前端缓冲区复制到后端缓冲区并不是一个非常高性能的操作,并且会导致严重的同步问题。

如果你想缓存东西,你可能会把你的GUI分成单独的内容小部件,你可以使用fbo单独绘制成纹理-以一种小部件可能重叠的方式设计它。如果小部件的内容发生变化,您可以重新绘制它。要绘制整个窗口,只需将整个窗口内容从纹理重新绘制到主framebuffer中。

看起来问题解决了:

    glDisable( GL_BLEND ); 

我不知道为什么,但它看起来像之前混合的数据,尽管我没有找到任何关于它的文档和"glCopyPixels"似乎不应该这样做。

相关内容