现在我的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有这么一招吗?
如果您出于兼容性原因不想使用Framebuffer对象(但它们可以广泛使用),您也不希望使用旧版(和非可移植版)Pbuffers.这使您可以使用glReadPixels读取帧缓冲区的内容,并使用glTexImage2D创建包含该数据的新纹理.
让我补充一点,我并不认为在你的情况下你会获得更多.在屏幕上绘制纹理要求每个像素至少需要纹理元素访问,如果替代方案只是像现在一样插入颜色,那么这并不是一个巨大的节省!
我真诚地怀疑从纹理绘制比绘制渐变更少工作.
在绘制渐变时:
在每个像素处插入颜色
在绘制纹理时:
纹理坐标在每个像素处插值
在每个像素处仍然插入颜色
每个像素的纹理查找
将查找颜色与当前颜色相乘
并非这些都是缓慢的,但绘制无纹理的多边形几乎和它一样快.