Est-ce une bonne pratique d'utiliser toutes les unités de texture disponibles?

9

Lors de l'application de plusieurs textures à un maillage, comme pour le bump-mapping, je lie généralement les textures aux premières unités de texture fixes, par exemple: diffuse = unité 0, bump = unité 1, spéculaire = unité 2, puis continue de les réutiliser pour chacune maille différente avec différentes textures. Mais je me suis toujours demandé pourquoi glActiveTextureprend en charge autant d'unités de texture (dans le lien précédent, il est dit au moins 80).

Il m'est donc venu à l'esprit qu'une façon possible de gérer les textures était de lier des textures distinctes à chaque unité disponible et de les laisser activées, en mettant simplement à jour l'index d'échantillonneur uniforme. Cela devrait améliorer les performances de rendu en réduisant le nombre de commutateurs de textures. Si vous avez moins de textures que les unités de texture maximales, vous n'avez jamais à délier une texture.

Est-ce une pratique standard sur les applications OpenGL en temps réel (je pense que cela s'applique également au D3D)? Et y a-t-il des implications non évidentes sur les performances de cette approche? Des frais généraux de mémoire peut-être?

glampert
la source

Réponses:

11

Le matériel moderne n'a pas vraiment le concept de points de liaison de texture tel qu'exposé par OpenGL. Au lieu de cela, l'unité de shader utilise un descripteur (qui est juste une sorte de gros pointeur) qui peut potentiellement traiter n'importe quelle texture tant qu'elle réside dans la mémoire vidéo. C'est ce qui rend possible des choses comme des textures sans reliure . Ainsi, la grande quantité d '"unités de texture" disponibles dans les implémentations actuelles essaie simplement de transmettre manuellement cette partie désormais non pertinente de l'API.

Cela dit, la façon recommandée d'implémenter ce que vous essayez de faire (en évitant de relier les textures) est d'utiliser des tableaux de texture , qui vous permettent d'indexer dynamiquement dans un ensemble de textures dans le shader, tant qu'elles ont toutes le même format et la même taille. Cette présentation contient plus de détails sur ces techniques et sur d'autres pour réduire la surcharge du pilote lors du rendu avec OpenGL moderne: Approche de la surcharge du pilote zéro

yuriks
la source
J'ai déjà vu cette présentation, c'est très bien. Je ne savais pas ce que vous mentionnez dans le premier paragraphe, alors merci pour cette info!
glampert