2017-10-13 7 views
0

Si ma compréhension est correcte, une unité de texture a un certain nombre de cibles (GL_TEXTURE_2D etc.) auxquelles je peux lier des textures. Je peux changer l'unité de texture actuellement active avec glActiveTexture. Lorsque j'appelle glBindTexture, je lie l'objet de texture spécifié à la cible spécifiée de l'unité de texture actuellement active, n'est-ce pas?Est-il suffisant d'appeler glActiveTexture pour éditer une texture une fois qu'elle a déjà été liée?

Lorsque je veux changer plus tard les paramètres d'une texture ou appeler une fonction comme glTexSubImage2D, suffit-il d'appeler glActiveTexture avec l'unité de texture à laquelle ma texture est liée? Ou dois-je appeler glBindTexture à chaque fois, même si la texture est déjà liée à une unité?

Répondre

2

Tant que vous savez quel état est lié à quelle unité, vous pouvez compter sur simplement changer glActiveTexture pour passer à l'unité de droite pour le trouver.

Toutefois, vous ne devriez pas compter sur cela à cette fin. Non pas parce que OpenGL n'est pas fiable, mais parce que vous pouvez être sur ce que vous pensez avoir lié à quelle unité.

En outre, il estompe la ligne entre la liaison d'une texture pour rendre avec elle et la liaison d'une texture à modifiez il. Vous voulez que les deux soient entièrement séparés. Tout d'abord, parce que modifier l'état d'une texture dans la boucle de rendu (où vous la liez pour la modifier) ​​est de mauvaise forme et risque d'être lent. Et deuxièmement, pour que le moment soit venu d'adopter GL 4.5 et DSA, vous pouvez le faire rapidement et efficacement.

0

Vous pouvez considérer l'unité Texture comme des tubes présents sur le GPU. De telles unités de texture sont présentes sur le GPU. En appelant glActivateTexture(), vous indiquez au GPU OpenGL de dire quelle texture je vais lier au prochain chargement/connectez-le dans l'unité de texture mentionnée. En disant glBindTexture(), vous dites au pilote que quelles que soient les opérations que je suis sur le point de faire c'est sur la texture que j'ai lié. Comme une fois que vous avez appelé glTextureImage2D, votre texture réside dans la mémoire du pilote et vous n'avez donc pas accès directement à celle-ci. Ainsi, le pilote vous a donné la possibilité de manipuler l'objet que vous liez et de dire au pilote de quelle ressource je parle.

Ainsi, lorsque vous avez rendu son travail, activez l'unité de texture, puis liez votre texture. Comme vous l'avez fait activer d'abord et lier plus tard, la texture sera automatiquement liée à l'unité que vous avez donnée.

Si vous ne mentionnez pas l'unité de texture par défaut, GL_TEXTURE0 sera utilisé et, par conséquent, cela pourrait parfois prêter à confusion.

Espérons que cela aide.