Quelle est la taille de texture optimale?

12

J'ai récemment ajouté un packager de textures à mon projet qui regroupera une certaine quantité de textures en une seule, comme ceci:

Texture emballée

Ainsi, par exemple, celui-ci a une taille de 582x1023 pixels. Le but d'ajouter ces textures compactes était évidemment d'améliorer les performances, donc je voulais rechercher la taille de texture optimale pour les textures OpenGL (en utilisant LWJGL). Les choses que j'ai trouvées étaient qu'une taille de texture maximale largement prise en charge semble être 1024x1024, selon cela par exemple. Cela me semble étrange, car évidemment, beaucoup de textures seules seraient plus grandes que cela, alors que se passe-t-il avec celles-ci? Je suis sûr que la plupart des cartes graphiques prennent en charge des textures plus grandes que cela. Puis-je raisonnablement m'attendre à ce que la plupart des cartes graphiques gèrent par exemple les textures 4096x4096 (ou peut-être même plus grandes que cela)?

Pour en venir à mon deuxième point (j'espère que cela compte toujours pour une question, mais cela revient essentiellement au même problème): les textures doivent-elles être dimensionnées à une puissance de 2 (256x256, 512x512, 1024x1024, 2048x2048, ..) et devraient Je rembourre des textures plus petites que celle à la prochaine puissance de 2? Selon cette question de 2011, ce n'est pas une exigence, mais peut améliorer les performances et éviter les bugs mineurs et celui de 2012 dit que vous devez certainement remplir les textures. Je me rends donc compte que ces questions ont été posées auparavant, mais elles sont raisonnablement datées pour que les réponses aient changé et, en outre, chacune ne répond que partiellement à ma question. Comment les autres projets / gèrent-ils cela?

TL; DR: Quelles tailles de textures puis-je attendre de la plupart des cartes graphiques? Quelles sont les tailles de texture optimales (ou y en a-t-il)? Dois-je rembourrer la largeur des textures à la prochaine puissance de 2?

lune de miel
la source
4
Le GPU ne propose que des puissances de 2. Si vous ne remplissez pas manuellement vos textures, le GPU (ou le moteur de jeu de votre choix) le fait pour vous, ce qui entraîne un léger retard à l'exécution par texture, ce qui peut s'additionner. Je ne peux cependant pas vous aider sur les tailles de texture maximales / optimales.
ketura
@ketura Ah je vois, merci. Alors disons que j'ai une image de 513x10. Serait-il plus rapide de le remplir à 1024x1024 puis de transférer tous ces pixels vides ou de laisser le GPU faire cela?
2015
4
Vous n'auriez pas besoin d'aller aussi haut. 1024 x 16 fonctionnerait; il n'a pas besoin d'être CARRÉ, juste une puissance de 2 dans chaque direction. Bien que dans ce cas, je considérerais sérieusement si je ne pouvais pas épargner un pixel et le réduire à 512x16, lol.
ketura

Réponses:

6

Je vais essayer de répondre à cela, bien que YMMV. J'utilise le Steam Hardware Survey ( http://store.steampowered.com/hwsurvey?platform=pc ) pour déterminer quelle est la RAM vidéo (VRAM) disponible sur la plupart des ordinateurs. En regardant les résultats au 13/10/2015 (aujourd'hui), près de 85% des gens ont 1024 Mo de VRAM.

Votre question est très large, car elle n'indique pas le matériel cible (console, PC, ordinateur de poche, appareils mobiles?) Je vais parler des PC et vous pouvez extrapoler pour d'autres plates-formes en fonction des spécifications matérielles.

En supposant 32 bits de couleur + alpha par pixel, soit 4 octets par pixel, 1 Go de VRAM peut contenir au maximum ~ 256 millions de pixels. Cela équivaut à 256 textures 1K par 1K. Cela suppose (à tort) que vous ne souhaitez conserver que des textures dans votre VRAM, alors qu'il y aura une foule d'autres choses (par exemple des données de maillage, si vous travaillez en 3D) pour lesquelles vous devez laisser de l'espace. Vous voudrez probablement aussi laisser plus d'espace pour le mip-mapping des textures, ce qui fonctionne généralement mieux si vos textures sont des puissances de deux.

Les consoles modernes (XBOX One et PS4) ont 4 à 8 Go de RAM unifiée, la plupart des ordinateurs de poche et des appareils mobiles ont 1 à 2 Go de RAM unifiée, avec des restrictions sur la quantité que vous pouvez allouer en tant que VRAM.

Je créais généralement des textures 2K pour que cela fonctionne sur la plupart des PC, ce qui permet de réduire la taille des appareils bas de gamme. Si vous écrivez un jeu 2D et que vous souhaitez cibler des écrans de résolution supérieure (4K, iPad rétine, etc.), vous pouvez utiliser des textures 4K pour l'arrière-plan, mais pour la plupart des autres parties, cela peut être exagéré.

J'espère que cela a aidé et n'a pas boué les eaux.

Vijay Varadan
la source
Merci pour la réponse, ça aide vraiment. Quant à la largeur, désolé, j'ai oublié d'inclure quelques détails: je développe pour les PC en 2D. Que se passerait-il si vous utilisez des textures plus grandes que la taille de texture maximale prise en charge? Cela ne fonctionne-t-il pas du tout ou devient-il plus lent?
flotothemoon
1
On dirait que ma réponse était parfaite. Vérifier les autres messages du forum du site Les textures 2k sont ce que vous devez prendre en charge pour que votre jeu fonctionne sur la plupart des appareils. La taille limite de texture dépend du matériel spécifique et de la version particulière d'OpenGL-ES. Je ne sais pas quel serait le message d'erreur spécifique, mais il proviendrait d'OpenGL-ES lorsque vous essayez de charger la texture. Liens utiles: answers.unity3d.com/questions/563094/… , forum.unity3d.com/threads/texture-sizes-and-videocards.281422 et feedback.wildfiregames.com/report/opengl/feature/…
Vijay Varadan
Quand j'essaye de charger ou d'essayer de lier la texture? Ou est-ce la même chose ici?
flotothemoon