加载后查找OpenGL纹理大小(以字节为单位)

时间:2010-06-12 11:56:46

标签: opengl 2d textures pixels

嘿,我的纹理加载了glTextImage2D。 我希望在加载到VRAM后得到纹理的大小,我需要做什么? 我的内部格式是RGBA,纹理格式各不相同。

2 个答案:

答案 0 :(得分:4)

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

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)额外的内存消耗。但请注意,至少据我所知,纹理内存也可能会碎片化,可能会使估计的可用内存减少。

答案 1 :(得分:1)

使用GetTexLevelParameter,可以为您提供(针对每个级别):

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

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

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

mipmap计数由OpenGL规范决定,具体取决于纹理目标:纹理数组元素有自己的mipmaps集,每个立方体面纹理都有自己的mipmap集。 mipmap的尺寸对于每个级别都是半角的,直到它们变为1.在尺寸不是2的幂的情况下,它们被舍入到较低的整数。