Atlas de texture vs texture de tableau: dans quelle mesure sont-ils traités différemment par le CPU et le GPU et comment cela affecte-t-il les performances?

10

Unity 5.4 (actuellement en version bêta), apportera une fonctionnalité très attendue (depuis 2013) qui est des textures de tableau - dans le même vain que ArrayTexture d'OpenGL . Cependant, après avoir fait quelques lectures sur les tableaux-textures et les atlas de texture, je ne comprends toujours pas très bien les différences techniques sur leur utilisation par les CPU et les GPU.

Donc, pour être plus précis, je voudrais demander une explication sur les principales différences entre la façon dont les atlas de texture et les tableaux de textures sont traités par le CPU et le GPU et, surtout, comment ces différences peuvent avoir un impact sur les performances et la gestion de la mémoire (par exemple, comment les tableaux de textures peuvent être plus performants que les atlas de textures, etc.).

Si les détails techniques sur la mise en œuvre d'Unity manquent en raison de sa malheureuse fermeté, je serais assez heureux d'avoir une réponse concernant OpenGL.s ArrayTexture.

ASteer
la source
Je ne suis pas surpris que vous n'ayez pas trouvé de comparaison technique, car les deux dépendent de l'implémentation (plus pour les tableaux).
Wondra
Vous aurez du mal à obtenir des informations sur le fonctionnement des composants internes du moteur Unity, car il s'agit d'une boîte noire à source fermée. La seule chose que vous pouvez faire est de profiler chaque cas et d'obtenir une comparaison de l'utilisation du processeur et du processeur. Pour comprendre comment cela fonctionne, il faudrait qu'un ingénieur Unity intervienne ou que leur code source soit ouvert ou divulgué.
jgallant
@ Jon Assez bien, mais en fait j'étais plus intéressé par une réponse indépendante du moteur. Si cela varie beaucoup, je peux mettre à jour la question pour parler, par exemple, d'ArrayTexture d'OpenGL: opengl.org/wiki/Array_Texture
ASteer

Réponses:

11

Comme indiqué dans les commentaires ci-dessus, les performances vont dépendre de l'implémentation, de votre matériel particulier et de ce que vous essayez de faire avec les textures, donc la seule réponse fiable est de profiler chaque alternative.

Il existe cependant quelques différences dans la façon dont vous utilisez chaque option, qui s'appliqueront de manière cohérente:

Une grande différence est que, pour les textures de tableau, chaque texture est traitée séparément à des fins telles que l'encapsulation des coordonnées de texture ou le mipmapping.

Cela évite les problèmes courants avec les atlas de texture où nous devons ajouter un remplissage entre les échantillons de texture adjacents pour empêcher les échantillons à leurs bords de saigner ensemble, en particulier dans les niveaux de mip plus profonds.

Cela signifie également que si vous voulez que vos textures soient carrelées, vous pouvez utiliser le matériel d'échantillonnage de texture pour le faire comme avec une texture vanille. Avec les atlas, nous devons généralement faire le calcul de la mosaïque dans notre fragment shader, car l'échantillonneur n'enveloppe que les coordonnées de texture enveloppes / miroirs / pinces / bordures sur tout l'atlas, pas les tuiles individuelles à l'intérieur.

La principale restriction des textures de tableau est qu'elles nécessitent que toutes leurs textures constitutives aient la même résolution et le même nombre de niveaux de mip. Si vous essayez de regrouper des textures avec des besoins de résolution très différents (par exemple, stocker des tuiles de terrain dont la LoD tombe avec la distance dans une texture virtuelle ), vous voudrez peut-être plutôt la flexibilité d'un atlas.

DMGregory
la source
Merci, c'est exactement ce que je recherchais. Je veux dire, pas de réponse sur ce qui est plus rapide et moins gourmand en mémoire - car bien sûr, cela dépend de la mise en œuvre. Pourtant, j'étais sûr que certains conseils sur le fonctionnement de chaque cas pourraient être utiles pour comprendre leurs meilleurs et les pires scénarios habituels. Votre réponse m'a en effet aidé à ce sujet.
ASteer
Autre inconvénient des textures de tableau: elles sont limitées par GL_MAX_ARRAY_TEXTURE_LAYERS. Sur mon GPU semi-moderne, c'est 2048, donc si vous voulez des tonnes de petites textures, cette limite est peut-être trop basse.
jwd