c++ - 如何在 OpenGL 中绘制纹理

标签 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 高度的纹理,然后将其缩放为宽度 x 高度以提高性能并降低内存使用量。 openGL有这样的技巧吗?

最佳答案

如果你不想使用Framebuffer Objects出于兼容性原因(但它们非常广泛可用),您不想使用旧版(且不可移植)Pbuffers任何一个。这使您可以很容易地使用 glReadPixels 读取帧缓冲区的内容。并使用 glTexImage2D 使用该数据创建新纹理.

让我补充一点,我真的不认为在您的情况下您会收获很多。在屏幕上绘制纹理至少需要访问每个像素的纹素,如果替代方法只是像您现在所做的那样插值颜色,那实际上并不能节省多少!

关于c++ - 如何在 OpenGL 中绘制纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/640874/

相关文章:

c++ - 我对 GLM lookAt 函数的理解不一致

graphics - IcCube6 中的值相关颜色

C++多重继承私有(private)成员模糊访问

c++ - 在 iOS 上使用 OpenCV 文件存储

c++ - std::bind 和右值引用

c++ - GLSL:未呈现制服的变化

linux - 当我更改 cuda 内核时,为什么 cudaGraphicsGLRegisterBuffer 会出现段错误?

c++ - C++ 中的 clr 托管 - 程序集路径

cocoa - 相同的 QtOpenGL 代码在使用 Carbon 时运行速度大约慢 15 倍(与 Cocoa 相比)

javascript - javascript 中的范围选择器。范围无效?