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.
la source
Réponses:
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.
la source
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.