Combien de textures puis-je généralement lier à la fois?

23

Je suis en train de développer un moteur de jeu, et cela ne fonctionnera que sur du matériel moderne (modèle Shader 4+). Je suppose que, lorsque j'en aurai fini, ce ne sera pas une exigence aussi déraisonnable.

Ma question est: combien de textures puis-je lier à la fois sur une carte graphique moderne? 16 serait suffisant. Puis-je m'attendre à ce que la plupart des cartes graphiques modernes prennent en charge ce nombre de textures?

Ma GTX 460 semble prendre en charge 32, mais je ne sais pas si c'est représentatif de la plupart des cartes vidéo modernes.

Avi
la source
Quelle API de rendu utilisez-vous?
Adam
2
OpenGL bien sûr :)
Avi

Réponses:

53

Le nombre de textures pouvant être liées à OpenGL n'est pas 32 ou 16 . Ce n'est pas ce que vous obtenez glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Cette fonction récupère le nombre de textures accessibles par le fragment shader .

Vous voyez, chaque shader a sa propre limite du nombre de textures qu'il peut utiliser . Cependant, il existe également un nombre total de textures pouvant être utilisées, point final. Ceci est défini (en OpenGL) par GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Il y a donc deux limites: les textures par étape et les textures liées au total.

OpenGL 3.x définit le nombre minimum pour la limite par étape à 16, donc le matériel ne peut pas avoir moins de 16 textures par étape. Il peut avoir une limite plus élevée, mais vous savez que vous obtenez au moins 16. 3.x définit le nombre minimum pour les textures-total-bound comme 48. AKA: 16 * 3 étapes. De même, GL 4.x définit les nombres comme étant 16 textures par étape et 96 textures liées au total (soit 16 * 6 étapes, y compris les shaders de calcul).

Encore une fois, ce sont les nombres minimaux . Le matériel peut (et varie).

En ce qui concerne le matériel spécifique, vous pouvez vous attendre à ce que tout matériel de classe DX10 corresponde à ces chiffres. Le matériel de classe DX11 a une certaine variance; NVIDIA (GeForce 4xx +) et les puces AMD haut de gamme (alias: GCN-cores) peuvent avoir plus que les 16 par étage.

Nicol Bolas
la source
2
Je souhaite que ce soit la réponse acceptée. Cela m'aurait épargné 5 minutes de lecture inutile.
Fibbles
3

Je crois que 32 est le nombre maximum de textures pouvant être liées actuellement. Pour autant que je sache, même la série 8800 avait 32 unités de texture.

Pour autant que je sache, pour le support openGL 4.x, vous aurez besoin d'une carte nvidia Fermi ou plus récente (ou carte amd correspondante), les modèles haut de gamme semblent tous avoir 32 unités, tandis que les cartes les plus basses (GT 430, par exemple) ) en ont 16. Cependant, en regardant les fiches techniques AMD, ils énumèrent des nombres comme 80 ou 128 unités de texture, mais répertorient 32 unités ROP couleur qui semblent être restées constantes à travers les générations.

Le GTX 480, d'autre part, est répertorié avec 60 unités de texture et 48 unités ROP, tandis que les cartes d'extrémité inférieure comme la 430 n'auraient que 16 unités de texture et 4 unités ROP. Donc, dans l'ensemble, je ne suis pas vraiment convaincu que ce soit le nombre que vous recherchez réellement.

Vous pouvez vérifier le nombre d'unités de texture disponibles pour le rendu de pipeline de fonction non fixe avec glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);, cependant, donc si vous avez accès à un matériel diversifié, vous pouvez le vérifier vous-même.

EDIT: ce site vous permet de comparer les capacités openGL signalées de toutes sortes de cartes vidéo, qui devraient vous donner les chiffres dont vous avez besoin: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS: AMD et nvidia ont récemment introduit des "textures sans reliure", (amd a un nom différent) qui vous permet d'utiliser un grand nombre de textures sans les lier à des unités textutre, pour le moment, cela n'est disponible qu'en openGL.


la source
1
Après cela, la vraie réponse est quelque chose comme «vous avez autant que le matériel peut offrir». Ou, autrement dit, tout devrait fonctionner aussi vite que possible. (et en OpenGL qui couvre presque tous les domaines).
Darkwings
@Darkwings Je suppose que oui, lier plus de textures que le matériel ne peut gérer entraînera généralement une erreur ou le délai d'expiration du pilote. J'ai également mal lu, il a dit que le shader model 4+ et non opengl 4+. En regardant les premières cartes DX10 (familles de cartes X2900 et 8800), elles semblent toutes avoir au moins 16 unités de texture.
Je soulignais simplement le fait que, comme il peut être paramétré, il devrait l'être. Même si le jeu devait ramper sur des cartes plus anciennes, ce ne devrait pas être quelque chose de codé en dur mais une «exigence suggérée».
Darkwings
4
-1: Cette réponse est fausse. Voir ma réponse pour savoir pourquoi (c'est trop long à expliquer ici).
Nicol Bolas
1
Ce qui n'est peut-être pas immédiatement évident. Presque personne n'utilise les GL_TEXTURE n GLenums; utilisez plutôt GL_TEXTURE0 + n, où n est l'emplacement à lier. Les GLenums ne montent que jusqu'à 32 emplacements, mais cela ne signifie pas qu'OpenGL vous limite à 32. La spécification garantit qu'ils seront séquentiels. De plus, si vous n'utilisez pas DSA, vous souhaiterez peut-être réserver un emplacement pour la liaison à créer / modifier, de sorte que l'état utilisé pour créer / modifier ait moins d'interaction avec l'état utilisé pour le dessin.
Maximus Minimus