Question

Dites que vous avez quelque chose comme ceci:

glBindTexture(GL_TEXTURE_2D, my2dTex);
glBindTexture(GL_TEXTURE_1D, my1dTex);
glBegin...

Quel est le comportement correct OpenGL? Pour dessiner la texture 1d, le 2 ou les deux? Pour chaque texture actif sont là en fait plusieurs textures qui peuvent être liées à elle en même temps (à savoir un 1d, 2d, 3d cube map, etc.)?

Était-ce utile?

La solution

L'état de GL pour les liaisons est un nom de texture par cible (à savoir 1D / 2D / 3D / cube). Donc, lorsque vous appelez

glBindTexture(GL_TEXTURE_2D, my2dTex)
glBindTexture(GL_TEXTURE_1D, my1dTex)

GL se souviendra deux paramètres.

Maintenant, la réponse dont on GL utiliser dépend si vous avez un shader sur.

Si un shader est activé, le GL utilisera tout le shader dit utiliser. (Basé sur sampler1d / sampler2D ...).

Si aucun shaders est activé, il dépend d'abord de quel appel glEnable a été fait.

glEnable(GL_TEXTURE_2D)
glEnable(GL_TEXTURE_1D)

Si deux sont activés, il y a une règle de priorité statique dans la spécification (3.8.15 application Texture dans la spécification GL 1.5).

Cube > 3D > 2D > 1D

Dans votre cas, si vos deux cibles de texture sont activés, la 2D sera utilisée.

Comme une note de côté, remarquez comment un shader ne se soucie pas si oui ou non la cible de texture est activée ...

Modifier pour ajouter:

Et pour les gens qui veulent vraiment obtenir les détails de graveleux, vous toujours ont une texture liée pour chaque cible * chaque unité. Le nom 0 (la valeur par défaut pour l'état de liaison) correspond à une série d'objets de texture, un par cible. glBindTexture(GL_TEXTURE_2D, 0) et glBindTexture(GL_TEXTURE_1D, 0) se lient tous deux une texture, mais pas le même ...

Ceci est historique, spécifiée pour correspondre au comportement de GL 1.0, où la texture des objets n'existaient pas encore. Je ne suis pas sûr de ce que la dévalorisation dans GL3.0 a fait avec cela, cependant.

Autres conseils

Je pense que la texture 1d sera tiré au sort. Pour autant que je sache, chaque unité de texture peut avoir qu'une seule texture liée à la fois. Le nombre de dimensions de la texture ne vient pas vraiment dedans.

Pour avoir plus d'une texture liée vous devez activer plus d'une unité de texture (à l'aide glActiveTexture), comme ceci:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, my2dTex);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_1D, my1dTex);

Cela vient de ma connaissance d'OpenGL 2.1, donc vous me corrigerez si elles ont introduit une fantaisie nouvelle extension de texture dans une version ultérieure!

La texture appliquée est la dernière spécifiée avec la routine BindTexture.

De la spécification:

  

Le nouvel objet lié à la texture   cible est et reste une texture de la dimension et du type spécifié par la cible   jusqu'à ce qu'il soit supprimé.   .... Si la   bind est la réussite du changement de pas est fait à l'état de l'objet texture lié,   toute précédente liaison à la cible est cassé .

En effet, dans votre exemple, il sera appliqué la texture 1D, car il « Ecraser » l'état de l'unité de texture active.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top