[英]Is there a quicker way to specify cubemap texture in OpenGL?
我通过以下方式为我的天空盒指定立方体贴图纹理:
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 我发现每行大约需要 4 毫秒来运行,所以使用 6 行来指定立方体贴图纹理总共需要大约 20-25 毫秒。 我在主循环的每次迭代中更新这个立方体贴图纹理,它大大减慢了我的主循环。 我知道天空盒传统上是静态的,但我的应用程序需要更新天空盒,因为我正在创建 360 度视频查看器。
有没有另一种方法可以更快地指定立方体贴图纹理? 我已经检查了 OpenGL 的文档,但我没有看到更快的方法。
更新:除了第0th
次迭代之外,我用glTexSubImage2D
替换了所有迭代的glTexImage2D
,现在 6 glTexSubImage2D
行所花费的总时间低于 5ms。 这对我来说是令人满意的,但我想我会留下这个问题,因为从技术上讲还没有答案。
glTexImage
速度较慢,因为每次调用它时,它都会在驱动程序端分配内存,并将图像中的像素数据从 CPU 复制到 GPU,这发生在总线上。
另一方面, glTexSubImage
不是每次都分配内存。 第一次调用时,它分配内存并保存指向它的指针。 稍后它只是通过该指针直接复制到内存中。
我认为根据您提到的过滤标志,OpenGL 可能会创建不同的纹理级别。
尝试使用级别为1
glTexStorage2D
。
此外,尝试使用 SOIL 库 - 它具有一个带有简单 API 的函数来加载立方体贴图。
您可以尝试的另一件事是压缩纹理,然后分析您的程序 - 我相信这个选项应该会给您最好的性能。
glTexImage2D 很慢,因为它将大量 dqta 从 CPU 内存复制到 GPU 内存。 如果图像来自视频解码器,它们可能已经在 GPU 内存中。 在这种情况下,您可以使用 OpenGL 扩展进行纹理化。
不过,这些往往是特定于平台的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.