如何通过纹理计算视频内存或内存的成本

时间:2013-10-29 06:48:47

标签: textures gpu

我想知道如何通过纹理计算视频内存或内存的成本。例如,TGA或DDS或PNG或JPEG需要多少视频内存。是一样的吗?

如果有相同的原因,为什么PVRTC在IOS中比PNG的成本更低。

我知道这是一个可以填满一本书的大话题。因此,在简要介绍之后,是否有人可以为此主题提供一些参考。提前谢谢。

2 个答案:

答案 0 :(得分:2)

  

TGA或DDS或PNG或JPEG。是一样的吗?

那是文件格式。文件格式与视频内存中的纹理格式没什么关系。

TGA,PNG和JPEG是通用文件格式。 当游戏读取文件时,它会解压缩文件并将其转换为内部表示。 从这些格式,png提供无损压缩,jpeg提供有损压缩,tga通常是未压缩的。我认为只有png和tga支持透明度。

DDS有点面向DirectX,因为它以DirectX支持的一种纹理格式存储数据。可以压缩(有损),未压缩,有或没有alpha通道。

据我所知,(至少)DirectX支持两种(类型)纹理格式 - 压缩和未压缩。 除此之外,纹理可能有mipmap或可能没有mipmap。 OpenGL 应该支持一些压缩格式,但我还没有尝试在OpenGL中使用它们,所以我不太确定。

  1. 没有mipmap的未压缩2D纹理至少需要width*height*pixel_size个字节的视频内存(驱动程序可能会分配更多)。
  2. 带有mipmap(完整mipmaps链)的未压缩2D纹理至少需要width*height*pixel_size*2个字节的视频内存。
  3. 没有mipmap的未压缩立方纹理至少需要size*size*pixel_size*6个字节的数据。
  4. 没有mipmap的未压缩卷纹理至少需要width*height*depth*pixel_size个字节的数据。
  5. 压缩纹理比未压缩纹理占用更少的字节,但很难预测确切的字节数。
  6. 现在,here's a list of texture formats for DirectX。任何不是 DXT 的内容都是未压缩的,但具有不同的通道集,每个通道的位数不同。例如,有几种16位纹理格式。 DXT格式提供有损压缩,如果将其应用于着色器中的法线贴图,则会产生明显的丑陋伪影。根据您的数据,DXT格式可以显着减少纹理的大小。因为格式是有损的,所以它不适用于普通地图,也不适用于应该用alpha通道掩盖的2D艺术。

      

    一些参考文献

    您可以下载DirectX sdk,opengl标准或平台文档(如果您正在开发ios之类的东西)并开始阅读。

答案 1 :(得分:1)

只需添加SigTerm的优秀回复:PVRTC将在“视频”内存和存储文件中使用4bpp或2bpp(除非使用zlib来获取额外的文件压缩。)iOS GPU知道如何解压缩这些格式原生。

这种PNG和JPG格式对于减少文件数据大小很有用,但必须解压缩到32bpp才能被GPU访问。这是必要的,因为这些格式不允许随机访问像素数据,这对于纹理化至关重要。

FWIW,关于PVRTC和其他纹理压缩方法的一些背景信息can be found here