繁体   English   中英

如何在OpenGL中绘制纹理

[英]How do draw to a texture in OpenGL

现在我的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创建包含该数据的新纹理。

让我补充一点,我并不认为在你的情况下你会获得更多。 在屏幕上绘制纹理至少需要每个像素访问纹理元素,如果替代方法只是像现在一样插入颜色,那么这并不是一个巨大的节省!

我真诚地怀疑从纹理绘制比绘制渐变更少工作。

在绘制渐变时:

  • 在每个像素处插入颜色

在绘制纹理时:

  • 纹理坐标在每个像素处插值
  • 在每个像素处仍然插入颜色
  • 每个像素的纹理查找
  • 将查找颜色与当前颜色相乘

并非这些都是缓慢的,但绘制无纹理的多边形几乎和它一样快。

考虑使用显示列表而不是纹理。 纹理读取(特别是对于大型读取)比8或9个函数调用慢得多。

在进行任何优化之前,您应该确保完全理解瓶颈。 你可能会对结果感到惊讶。

嘿那里,以为我会给你一些见解。

基本上有两种方法可以做到这一点。

帧缓冲对象(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

希望有所帮助!

查看FBO - 帧缓冲对象。 它是一个扩展,可以渲染到任意渲染,包括纹理。 此扩展应该可以在最新的硬件上使用。 这是一个关于FBO的相当好的入门: OpenGL帧缓冲对象101

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM