【问题标题】:OpenGL: Why do square textures take less memoryOpenGL:为什么方形纹理占用更少的内存
【发布时间】:2016-08-08 22:05:41
【问题描述】:

问题: 为什么相同数量的像素存储在方形纹理中比存储在长矩形纹理中占用的视频内存要少得多?

示例: 我正在使用 glTexImage2D 命令创建 360 个 4x16384 大小的纹理。内部格式为 GL_RGBA。 视频内存:1328 MB。

如果我使用相同的数据创建 360 个 256x256 纹理,则内存使用量小于 100MB。

使用集成的 Intel HD4000 GPU。

【问题讨论】:

  • 我不是 100% 确定,但我认为这与 OpenGL 如何通过其 glTexture 调用处理像素数据有关。当图像是正方形时,我认为它与 2 的幂有关,因为它将数据存储在后台缓冲区中以准备渲染。
  • 你在生成mipmap吗?我认为你没有,但只是为了确定 ;)
  • @Mars:你说得对,我忘了我没有使用 mipmap。
  • @FrancisCugler:正如您所建议的那样,答案可能是特定于实现的,但在论坛上,共识似乎是只要维度是 2 的幂,就没有 non - 方形纹理。
  • 最简单的方法是在具有不同硬件的机器上进行尝试,最好使用专用 GPU。您正在使用哪个版本的 OpenGL 进行测试? 4.0?

标签: opengl


【解决方案1】:

这不是关于纹理是矩形的。这是关于非常的维度之一。

为了以最佳方式从纹理中选择纹素,硬件将采用所谓的 swizzling。一般的想法是,它将重构纹理中的字节,以便在 2 维中彼此相邻的像素也将成为内存中的邻居。但是这样做需要纹理在两个维度上都具有一定的最小尺寸。

现在,纹理过滤硬件可以忽略这个最小尺寸,而只从纹理实际尺寸内的像素中获取。但是额外的存储空间仍然存在,占用空间没有任何用处。

鉴于您所看到的,很有可能英特尔的出色硬件的基本最小尺寸为 32 或 64 像素。

在 OpenGL 中,除了您在此处所做的之外,您无能为力来检测这种不一致。

【讨论】:

  • 谢谢,刚接触 OpenGL 我不知道 swizzling。实际上,将每个纹理的 4x16384 大小增加到 32x16384 并没有增加内存使用量(第一次增加发生在 64x16384)。这表明——正如你所建议的——英特尔芯片组的 OpenGL 实现至少为一个方向分配了 32 个像素。我已将您的答案标记为解决方案。
  • 没有像 NSight 这样的工具可以检测到吗?
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
相关资源
最近更新 更多