据我了解,使用Texturetool制作的PVR纹理只是压缩的图像。因此,区别在于文件大小。
坦白说,文件大小让我不感兴趣。我想知道的是,PVR纹理可以比普通的.PNG纹理消耗更少的RAM吗?还是这完全取决于纹理格式(例如RGBA8888
等)?
基本问题将是:
给定X.png
和X.pvr
,如果我同时使用纹理格式RGBA8888
显示它们,那么一个将比另一个消耗更少的RAM?
最佳答案
是的,PVR在所有阶段都将消耗更少的RAM –在访问时由GPU实时解压缩。没有中间减压。
在数字视频中使用的类似于PVR的方法是,与其在每个像素处存储RGB而不是转换为YUV,然后在每个像素处存储Y以及每个四个像素块仅将U和V存储两次。因此,您将块的128位变为64位。要返回RGB,输出器会读取完全正确的Y,并根据需要内插或访问最近的U和V。
像PVR这样的方案做类似的事情,即不将每个像素的全部值存储起来,而是从附近的上下文中推断出部分值。直接选择对应于附近的内容,但是在该GPU上安排了缓存。通常只是更深入地缩小一些通道的采样分辨率,例如指定样本的基本偏移量,然后为每个样本使用微小的精度也是很常见的。
因此,GPU始终可以通过仅读取数据的很小局部区域中的值来获取像素X的值。
这与传统方案(如PNG)形成对比,在传统方案中,如果可以提高压缩率,则必须知道X之前的流中的每个像素。实时处理此类事物会淹没GPU的内存带宽,因此是完全不切实际的,因此,此类纹理会从磁盘解压缩然后上传。
因此,像PVR这样的方案往往会导致压缩效果更差,每像素质量更低,但胜利之处在于它们可以置于VRAM压缩状态。如果使用PVR尝试找到舒适的平衡,则游戏通常会提高其纹理的分辨率。