纹理图集与数组纹理:CPU和GPU处理它们的方式有何不同,如何影响性能?


10

Unity 5.4(目前处于beta版)将带来一个期待已久的功能(自2013年起),即array-textures-与OpenGL的ArrayTexture相同。但是,在对数组纹理和纹理图集进行了一些阅读之后,我仍然不太了解CPU和GPU在使用它们方面的技术差异。

因此,更具体地说,我想请您解释一下CPU和GPU如何处理纹理图集和纹理阵列之间的主要差异,最重要的是,这些差异如何影响性能和内存处理(例如纹理阵列如何比纹理图集等具有更高的性能)。

如果由于不幸的封闭源而缺乏有关Unity实现的技术细节,那么我很乐意提供有关OpenGL.s ArrayTexture的答案。


我不惊讶您没有找到技术上的比较,因为两者都是依赖于实现的(对于数组而言更多)。
温德拉

您将很难获得有关Unity引擎内部功能的信息,因为它是封闭的黑匣子。您唯一可以做的就是分析每种情况,并让自己比较cpu和gpu的用法。要了解其工作原理,需要Unity工程师介入,或者打开或泄漏其源代码。
jgallant '16

@Jon Fair足够了,但实际上我对与引擎无关的答案更感兴趣。如果变化很大,我可以更新问题以谈论例如OpenGL的ArrayTexture:opengl.org/wiki/Array_Texture
ASteer

Answers:


11

如上面的评论所述,性能将取决于实现,您的特定硬件以及您要对纹理进行的处理,因此,唯一可靠的答案是分析每个替代方案。

不过,在使用每个选项的方式方面存在一些差异,这些差异将一贯适用:

一个很大的不同是,对于阵列纹理,每个纹理都被分别处理,例如用于包装纹理坐标或mipmapping。

这避免了纹理图集的常见问题,在纹理图集中,我们需要在相邻纹理色板之间添加填充,以防止边缘处的样本渗出在一起,尤其是在较深的mip级别。

这也意味着,如果您要平铺纹理,则可以使用纹理采样硬件来完成它,就像处理普通纹理一样。使用图集时,我们通常必须在片段着色器中进行平铺数学运算,因为采样器仅在整个图集上包裹/镜像/夹/边界纹理坐标,而不是其中的单个图块。

阵列纹理的主要限制是它们要求所有组成的纹理具有相同的分辨率和mip级别数。如果您试图将分辨率需求非常不同的纹理批量合并在一起(例如,将LoD随距离而下降的地形图块存储在虚拟纹理中),则可能需要图集的灵活性。


谢谢,这正是我所追求的。我的意思是,这不是确切的答案,即哪个更快,更少的内存占用-因为这些当然取决于实现。尽管如此,我确信有关每种情况的功能的一些指针对于理解其通常的最佳和最差情况是有用的。您的回答确实帮助了我。
ASteer '16

数组纹理的另一个缺点:它们受限制GL_MAX_ARRAY_TEXTURE_LAYERS。在我的半现代GPU上,该值为2048,因此如果您想要大量的微小纹理,则此限制可能太低。
jwd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.