我使用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"似乎不应该这样做。