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

时间:2017-10-27 22:05:32

标签: c++ opengl

我正在以下列方式为我的天空盒指定立方体贴图纹理:

texData

unsigned char*vector glTexImage2D

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

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

更新:我对除glTexSubImage2D次迭代以外的所有迭代替换0th glTexSubImage2D,现在6 var json = JsonConvert.SerializeObject(obj); var dictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(json); 行的总时间不到5毫秒。这对我来说是令人满意的,但我想我会把问题保持开放,因为从技术上来说还没有答案。

2 个答案:

答案 0 :(得分:0)

每次调用时,glTexImage都会变慢。它会在驱动程序端分配内存,并将像素数据从镜像CPU复制到通过总线发生的GPU驱动程序。虽然glTexSubImage不是每次都分配内存。它第一次分配内存并保存指针,然后直接复制到该内存。我认为根据过滤标志,你提到Opengl可能会创建不同的纹理级别。尝试使用级别为1的glTexStorage2d。另外请尝试使用具有simole一个函数的SOIL来加载立方体贴图。您可以尝试的另一个选项是压缩纹理然后配置文件我确信这些选项应该为您提供最佳方式。

答案 1 :(得分:-3)

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

这些往往是特定于平台的。