有没有更快的方法来在 OpenGL 中指定立方体贴图纹理
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,我发现每行运行大约需要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 扩展进行纹理化。
不过,这些往往是特定于平台的。
- 如何使用 std::累积在 C++ 中计算总和立方体
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 如何使用采样器立方体作为数组
- OpenGL,为什么这不是一个立方体?
- 在具有 MPI 的超立方体中广播
- Opengl 和 c++ 绘制多个立方体
- C++没有标准功能的立方体根查找器
- 现代OpenGL:如何获得立方体的矢量位置
- 使用此网格函数的立方体的正确顶点和索引是什么
- 为什么在GLFW窗口中没有用这个代码在我的屏幕上绘制立方体
- OpenGL中立方体的位置
- GL_INVALID_VALUE错误生成.纹理尺寸无效.在立方体贴图纹理 427*240*6 上
- 在犰狳立方体中添加一列 1 的有效方法
- 使用犰狳时无法加载犰狳立方体<uword>
- 将粒子投影到立方体的表面
- 犰狳:将立方体子视图(管)转换为矢量
- Armadillo是否支持布尔和8位型矩阵和立方体
- 有没有像犰狳中的稀疏立方体或某种使用稀疏矩阵作为立方体切片的方法?
- Qtopengl,为什么不能用不同的vbo画两个立方体
- OpenGL - 深度缓冲区在渲染半透明立方体时剪切掉不应该剪切的面