0

嘿,我有一个加载了 glTextImage2D 的纹理。我想在加载到 VRAM 后获取纹理的大小,我需要做什么?我的内部格式是 RGBA,纹理的格式各不相同。

4

2 回答 2

5

这可能对您有帮助,您可能可以从中推断出实际的内存使用情况。但是,我相信这仍然是一个近似值:

http://www.geeks3d.com/20100531/programming-tips-how-to-know-the-graphics-memory-size-and-usage-in-opengl/

(使用 NVIDIA 或 ATI 特定扩展查询 OpenGL 的总内存使用情况)

另请注意,根据我的经验,通过粗略计算来近似内存使用量通常就足够了。纹理“应该”存储 1,2 或 4 个组件而没有任何显着开销。因此,对于 WxH RGBA 纹理,计算 W*H*4。如果存储浮点纹理(即 GL_RGBA32F),则计算 W*H*4*4。对于 Mip-Maps,增加 (1/3) 额外的内存消耗。但是请注意,至少据我所知,纹理内存也可能会碎片化,可能会使您估计的可用内存更少。

于 2010-06-12T15:21:03.550 回答
1

使用GetTexLevelParameter,它可以给你(每个级别):

  • 宽度和高度 *
  • 深度
  • 内部格式 *
  • 压缩格式和相对大小

(*) 使用这些参数来计算纹理大小(对于指定级别)。

单个纹理内存使用取决于生成的 mipmap。实际上,要正确计算单个纹理使用的内存,您必须确定与纹理相关的 mipmap,然后汇总每个级别的内存使用量。

mipmap 计数由 OpenGL 规范根据纹理目标确定:纹理数组元素有自己的 mipmap 集,每个立方体面纹理都有自己的 mipmap 集。对于每个级别,mipmap 的维度减半,直到它们变为 1。如果维度不是 2 的幂,则将它们四舍五入到较小的整数。

于 2010-06-12T21:19:48.550 回答