现在我的OpenGL应用程序变得越来越大,越来越复杂,我注意到它在非常低端的系统(如上网本)上也变得有点慢。在Java中,我能够通过绘制到BufferedImage来解决这个问题,然后将其绘制到屏幕上,并在一段时间内更新缓存的渲染。我将如何使用C ++在OpenGL中执行此操作?
我找到了一些指南,但它们似乎只适用于较新的硬件/特定Nvidia卡。由于缓存的渲染操作只会偶尔更新一次,因此我可以牺牲速度来实现兼容性。
glBegin(GL_QUADS);
setColor(DARK_BLUE);
glVertex2f(0, 0); //TL
glVertex2f(appWidth, 0); //TR
setColor(LIGHT_BLUE);
glVertex2f(appWidth, appHeight); //BR
glVertex2f(0, appHeight); //BR
glEnd();
这是我特别关注的事情。占据整个屏幕的渐变每秒重新绘制多次。如何将其缓存到纹理然后只绘制该纹理以提高性能?
另外,我在Java中使用的技巧是将其渲染为1 X高度纹理,然后将其缩放到width x height以提高性能并降低内存使用量。 openGL有这样的技巧吗?
答案 0 :(得分:5)
如果您出于兼容性原因不想使用Framebuffer Objects(但它们可以广泛使用),您也不想使用旧版(和非可移植版)Pbuffers。这使您可以使用glReadPixels简单地读取帧缓冲区的内容,并使用glTexImage2D创建包含该数据的新纹理。
让我补充一点,我并不认为在你的情况下你会获得更多。在屏幕上绘制纹理至少需要每个像素访问纹理元素,如果替代方法只是像现在一样插入颜色,那么这并不是一个巨大的节省!
答案 1 :(得分:5)
我真诚地怀疑从纹理中绘制比绘制渐变更少工作。
绘制渐变时:
在绘制纹理时:
并非这两种情况都很慢,但绘制无纹理多边形的速度非常快。
答案 2 :(得分:2)
考虑使用显示列表而不是纹理。纹理读取(特别是大型读取)比8或9个函数调用慢得多。
答案 3 :(得分:2)
在进行任何优化之前,您应确保完全了解瓶颈。你可能会对结果感到惊讶。
答案 4 :(得分:2)
基本上有两种方法可以做到。
帧缓冲区对象(FBO)用于更现代的硬件,后台缓冲区用于后退。
之前海报中的一篇文章是一篇很好的文章,并且有很多关于FBO的谷歌教程。
在我的2d引擎(Phoenix)中,我们决定只使用后台缓冲区方法。我们的课很简单,你可以在这里查看标题和来源:
http://code.google.com/p/phoenixgl/source/browse/branches/0.3/libPhoenixGL/PhRenderTexture.h http://code.google.com/p/phoenixgl/source/browse/branches/0.3/libPhoenixGL/PhRenderTexture.cpp
希望有所帮助!
答案 5 :(得分:0)
查看FBO - 帧缓冲对象。它是一个扩展,可以渲染到任意渲染,包括纹理。此扩展应该可以在最新的硬件上使用。这是一个关于FBO的相当好的入门书:OpenGL Frame Buffer Object 101