我正在使用OpenGL来优化GUI渲染。渲染整个场景时,它工作正常,但这不是最佳的,因为通常只有一小部分被改变。所以我尝试了这个:
glReadBuffer (GL_FRONT);
glDrawBuffer (GL_BACK);
glCopyPixels (0, 0, sz.X, sz.Y, GL_COLOR);
glFlush();
这应该将前缓冲区复制到后台缓冲区,以便之后我可以使用glViewport更改一部分限制。不幸的是,当场景发生变化时,看起来像是在实际渲染之后执行了glCopyPixels命令,因此原始内容对具有新图形的alphablends进行排序。
有什么问题?或者有更好的方法吗? (对于记录,当我什么也不做的时候,前缓冲区开始用后台缓冲区和类似的东西闪烁......)
答案 0 :(得分:3)
但这不是最佳
是什么让你这么想? OpenGL和现代GPU的设计理由是,在最坏的情况下,你必须重新绘制整个东西,在这种情况下,事情也应该表现良好。
或者有更好的方法吗?
是:重绘整个场景。 (或者我在下面建议)
对于现代低端GPU而言,每秒能够轻松地向屏幕投放数千万个三角形,2D GUI的几百到一千三角形都是可以忽略不计的。
事实上,你的复制东西可能会比重绘所有内容更糟糕,因为从前端到后端缓冲区的复制不是一个非常高效的操作,会导致严重的同步问题。
如果您想要缓存内容,可以将GUI拆分为单独的内容小部件,您可以使用FBO单独绘制到纹理中 - 以小部件可能重叠的方式进行设计。如果窗口小部件的内容发生更改,则重绘窗口要绘制整个窗口,只需将纹理中的完整窗口内容重绘为主帧缓冲区。
答案 1 :(得分:0)
好的,这似乎解决了这个问题:
glDisable( GL_BLEND );
我不知道为什么,但它看起来像混合数据之前,尽管我没有在文档中找到任何关于它的内容,“glCopyPixels”似乎不应该这样做。