我想知道如何通过纹理计算多少视频内存或内存成本。例如,TGA 或 DDS 或 PNG 或 JPEG 需要多少视频内存。是相同的?
如果有相同的,为什么 PVRTC 在 IOS 中比 PNG 花费更少的显存。
我知道这是一个可以写满一本书的大话题。那么在简要介绍之后,任何人都可以为这个主题提供一些参考。提前致谢。
TGA 或 DDS 或 PNG 或 JPEG。是相同的?
那是文件格式。文件格式与显存中的纹理格式关系不大。
TGA、PNG 和 JPEG 是通用文件格式。当游戏读取文件时,它会解压缩文件并将其转换为内部表示。在这些格式中,png 提供无损压缩,jpeg 提供有损压缩,tga 通常是未压缩的。我认为只有 png 和 tga 支持透明度。
DDS 有点面向 DirectX,因为它以 DirectX 支持的一种纹理格式存储数据。可以压缩(有损)、未压缩、带或不带 Alpha 通道。
据我所知,(至少)DirectX 支持两种(类型的)纹理格式——压缩和未压缩。除此之外,纹理可能有 mipmap 或可能没有 mipmap。OpenGL应该支持一些压缩格式,但是我没有尝试在OpenGL中使用它们,所以我不太确定。
width*height*pixel_size
视频内存字节(驱动程序可能分配更多)。width*height*pixel_size*2
视频内存字节。size*size*pixel_size*6
字节数据。width*height*depth*pixel_size
字节数据。现在,这里是 DirectX 的纹理格式列表。任何不是DXT的东西都是未压缩的,但具有不同的通道集和每个通道的不同位数。例如,有几种 16bit 纹理格式。DXT 格式提供有损压缩,如果将其应用于着色器中的法线贴图,则会产生明显的丑陋伪影。根据您的数据,DXT 格式可以显着减小纹理的大小。因为格式是有损的,所以它不适合法线贴图和应该用 alpha 通道遮罩的 2d 艺术。
一些参考资料
您可以下载 DirectX sdk、opengl 标准或您的平台文档(如果您正在开发类似 ios 的东西)并开始阅读。
只是为了补充 SigTerm 的出色回复:PVRTC 将在“视频”内存和存储文件中使用 4bpp 或 2bpp(除非使用 zlib 之类的东西来获得额外的文件压缩。)iOS GPU 知道如何本地解压缩这些格式.
PNG 和 JPG 等格式对于减小文件数据大小很有用,但必须解压缩到例如 32bpp,以便 GPU 可以访问。这是必要的,因为这些格式不允许随机访问像素数据,这对于纹理化至关重要。
FWIW,关于 PVRTC 和其他纹理压缩方法的一些背景信息可以在这里找到: