如何在OpenGL中绘制纹理

时间:2009-03-12 23:25:48

标签: c++ opengl graphics

现在我的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有这样的技巧吗?

6 个答案:

答案 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