Answers:
GPU压缩纹理格式(例如DXT / BC / ETC)经过专门设计,可以直接从其压缩形式读取。它们无需解压缩到原始RGBA缓冲区中。
这种工作方式是每个纹理像素块(通常为4x4)占用一定数量的位-因此我们确切地知道在缓冲区中寻找特定纹理像素的距离-可以解压缩这些块而无需读取所有周围的东西/之前的纹理信息。GPU包含专用硬件,可根据需要仅解压缩请求的texel块,以满足来自着色器的纹理采样请求。
这与jpg和png这样的格式形成对比,后者的每个texel占用的空间量在整个图像中可能会有所不同(详细区域占用更多数据,可预测区域占用较少的空间),因此要找到特定的texel,您必须解压缩整个图像,或者至少是大块/分布式块。但是,由于它们可以选择性地压缩纹理的可预测区域,因此它们倾向于将图像压缩为较小的大小,以便存储在磁盘上或通过网络传输,这要比我们从GPU友好格式获取的图像小。针对不同用途的不同策略。
通常,问多个问题应该通过多个帖子来完成,但是由于这是一个很短的答案,因此我也会提到第3点:
“ 帧缓冲区 ”只是视频存储器的一小部分,我们决定将其用于存储要呈现给屏幕的合成图像。请注意JarkkoL答案中的细节,在某些专用硬件上,我们可能会选择将该缓冲区放置在可用视频内存的特定部分中,该部分针对渲染目标的带宽需求进行了优化。
对您问题的答案确实取决于平台。通常,BC格式以压缩形式保存在内存中,解压缩由GPU纹理单元在飞行中完成,但是也有例外。即,已知Xbox 360会在TU提取数据之前解压缩完整的4x4像素BC块以进行缓存,从而提高了缓存的使用率。我不知道会在加载时解压缩整个纹理以使其摇动的任何平台,但是由于增加的内存和带宽使用量,我对此表示高度怀疑。
帧缓冲区也是一样-它取决于平台。在Xbox 360上,您必须使用10MB的专用高带宽EDRAM来渲染目标。在Xbox One上,由于带宽较高(由于也可以从Xbox 360上获取),因此仍具有32MB的特殊ESRAM作为渲染目标的首选,但渲染目标也可以驻留在常规DDR3内存中。