有没有更快的方法来在 OpenGL 中指定立方体贴图纹理

Is there a quicker way to specify cubemap texture in OpenGL?

本文关键字:立方 立方体 体贴 纹理 OpenGL 方法 有没有      更新时间:2023-10-16

我通过以下方式为我的天空盒指定立方体贴图纹理:

 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 0, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(0));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 1, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(1));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 2, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(2));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 3, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(3));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 4, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(4));
 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 5, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(5));

texData是一个unsigned char* vector.

使用Visual Studio Debugger,我发现每行运行大约需要4ms,因此使用6行指定立方体贴图纹理总共需要大约20-25ms。我在主循环的每次迭代中更新此立方体贴图纹理,它大大减慢了我的主循环速度。我知道天空盒在传统上是静态的,但我的应用程序需要更新天空盒,因为我正在创建一个 360 度视频查看器。

有没有另一种方法可以更快地指定立方体贴图纹理?我已经检查了OpenGL的文档,但我没有看到更快的方法。

更新:除了0th次迭代之外,我用glTexSubImage2D替换了glTexImage2D,现在 6 glTexSubImage2D行所花费的总时间不到 5 毫秒。这对我来说是令人满意的,但我想我会把这个问题留给开放,因为从技术上讲还没有答案。

glTexImage速度

较慢,因为每次调用它时,它都会在驱动程序端分配内存,并将像素数据从图像从CPU复制到GPU,这发生在总线上。

另一方面,glTexSubImage不是每次都分配内存。在第一次调用时,它会分配内存并按住指向它的指针。稍后它只是通过该指针直接复制到内存中。

我认为根据你提到的过滤标志,OpenGL可能会创建不同的纹理级别。

尝试将glTexStorage2D与级别 1 一起使用。

另外,尝试使用 SOIL 库 - 它有一个带有简单 API 的函数来加载立方体图。

您可以尝试的另一件事是压缩纹理,然后分析您的程序 - 我相信此选项应该为您提供最佳性能。

glTexImage2D很慢,因为它将大量的dqta从CPU内存复制到GPU内存。如果图像来自视频解码器,则它们可能已经在 GPU 内存中。在这种情况下,您可能能够使用 OpenGL 扩展进行纹理化。

不过,这些往往是特定于平台的。