如果我有很多纹理(例如5个以上的贴图)绑定到同一个纹理单元,那么与仅2个或3个纹理相比,它对缓存的工作效果是否更差?

#1 楼

只是增加了malletett的答案,的确,增加对着色器中不同纹理数据的访问次数将增加对GPU缓存的压力,但是还有其他一些因素会显着影响效果。与CPU缓存一样,GPU中可能存在多层缓存,这也可能使事实变得复杂。纹理单元<= L0 <= L1 <= ..Memory

避免锯齿->使用MIP贴图

如果场景中的纹理数据很小,由于透视图或简单的缩放比例,并且您没有使用MIP映射,那么您将获得别名。这不仅会产生视觉人工制品;这很可能是性能问题。

一旦获得别名,对纹理的地址访问将变得不一致,这不仅会破坏缓存,而且会引入很多DRAM。分页符”(更正确地说是行分隔符),这可能会造成很大的损失。 MIP映射有助于减少不连贯性。等等)从8bpp降低到2bpp,您可以将内存带宽/缓存的效率从4倍提高到16倍。这些方案(例如上面列出的方案)在硬件中是如此简单地解码,以致数据可以在整个缓存层次结构中保持压缩状态,而仅在纹理单元中被解压缩,从而有效地增加了这些缓存的大小。

数据大小

很明显,某些数据,例如在后续渲染中用作纹理数据的渲染目标,不能使用纹理压缩。只要有可能,请使用可以完成此工作的最小像素格式,即,如果可以使用32 / 16bpp(A)RGB,请不要使用4x32浮点格式!
这与上面的别名示例有些相关,但是我们已经看到了创建大型渲染目标但只有很少采样的情况。无论是在CPU还是GPU中,高速缓存行都非常长,因此,如果每条高速缓存行仅使用一个像素,则会浪费传输。

WRT压缩纹理也可以通过压缩来实现压缩在局部纹理像素之间有效共享数据。如果您没有一致的访问权限,那么除了减少内存占用量之外,压缩可能也无济于事。

相关纹理读取

缓存不多问题(很好,除非计算的访问非常不连贯),但是不是由顶点提供的UV坐标直接定义的纹理访问可能比直接定义的纹理访问慢。
VS交错纹理

尽管我怀疑这些天大多数纹理将以平铺或类似Morton(又称为Twiddled / Swizzled)的顺序(或什至两者结合)存储,但某些纹理可能仍然是以扫描线顺序排列,这意味着纹理的旋转很可能导致大量的高速缓存未命中/页面中断。不幸的是,我真的不知道如何确定特定格式是否以这种方式排列。

(有关背景阅读,请尝试Blinn的“纹理贴图的真相”。FWIW,走了几步进一步导致至少在某些早期PC硬件中使用了旋转顺序(即Morton顺序)纹理。

#2 楼

答案取决于您的意思。现代硬件(例如具有无边界纹理的硬件)实际上并不太在乎“绑定”多少个纹理。真正的问题是要使用多少。

纹理通常以缓存友好的方式存储数据(我相信,莫顿曲线)。如果使用更多的纹理,则将导致更多的高速缓存未命中,因为现在纹理相互竞争空间。水龙头很慢;不要使用太多。