0

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

如果有相同的,为什么 PVRTC 在 IOS 中比 PNG 花费更少的显存。

我知道这是一个可以写满一本书的大话题。那么在简要介绍之后,任何人都可以为这个主题提供一些参考。提前致谢。

4

2 回答 2

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(完整 mipmap 链)的未压缩 2D 纹理至少占用width*height*pixel_size*2视频内存字节。
  3. 没有 mipmap 的未压缩立方体纹理至少需要size*size*pixel_size*6字节数据。
  4. 没有 mipmap 的未压缩体积纹理至少需要width*height*depth*pixel_size字节数据。
  5. 压缩的纹理比未压缩的纹理占用更少的字节,但很难预测确切的字节数。

现在,这里是 DirectX 的纹理格式列表。任何不是DXT的东西都是未压缩的,但具有不同的通道集和每个通道的不同位数。例如,有几种 16bit 纹理格式。DXT 格式提供有损压缩,如果将其应用于着色器中的法线贴图,则会产生明显的丑陋伪影。根据您的数据,DXT 格式可以显着减小纹理的大小。因为格式是有损的,所以它不适合法线贴图和应该用 alpha 通道遮罩的 2d 艺术。

一些参考资料

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

于 2013-10-29T07:10:39.967 回答
1

只是为了补充 SigTerm 的出色回复:PVRTC 将在“视频”内存和存储文件中使用 4bpp 或 2bpp(除非使用 zlib 之类的东西来获得额外的文件压缩。)iOS GPU 知道如何本地解压缩这些格式.

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

FWIW,关于 PVRTC 和其他纹理压缩方法的一些背景信息可以在这里找到

于 2013-10-29T14:57:14.813 回答