Je ne suis toujours pas entièrement sûr que je comprends bien ce que vous voulez, mais je vais tenter le coup. Ce que j'avais à l'esprit est que lorsque vous appelez glTexImage2D
, vous spécifiez le format des texels que vous chargez et vous spécifiez le "format interne" de la texture que vous créez à partir de ces texels. Dans un cas typique, vous spécifiez (grosso modo) le même format pour les deux - par ex. vous utiliserez généralement GL_RGBA
pour les deux.
Il y a une raison pour spécifier si les deux: le format
(le paramètre proche de la fin de la liste) spécifie le format des texels que vous chargez de, mais le internal format
(celui proche du début de la liste des paramètres) spécifie le format de la texture réelle que vous créez à partir de ces texels.
Si vous voulez charger des texels, mais seulement en fait utilisation le canal alpha d'eux, vous pouvez spécifier GL_ALPHA
pour le internal format
, et c'est tout ce que vous aurez - lorsque vous associez cette texture à une surface, cela affectera seulement l'alpha, pas la couleur. Cela évite non seulement de faire une copie supplémentaire de vos texels, mais réduit (au moins généralement) la mémoire consommée par la texture elle-même, puisqu'elle n'inclut qu'un canal alpha, pas les trois canaux de couleur. Edit: Ok, en y réfléchissant un peu plus, il y a un moyen de faire ce que je veux, en utilisant seulement la texture. Tout d'abord, vous définissez la fonction de fusion pour utiliser simplement le canal alpha, puis lorsque vous voulez copier la couleur de la texture, vous appelez glTextureEnvf
avec GL_REPLACE
, mais lorsque vous voulez seulement utiliser le canal alpha, vous l'appelez GL_BLEND
. Par exemple, créons une texture verte et la dessinons (deux fois) sur un quad bleu, une fois avec GL_REPLACE, et une avec GL_BLEND. Par souci de simplicité, nous allons utiliser une texture Gree solide, avec alpha augmentation linéaire de haut (0) vers le bas (1):
static GLubyte Image[128][128][4];
for (int i=0; i<128; i++)
for (int j=0; j<128; j++) {
Image[i][j][0] = 0;
Image[i][j][1] = 255;
Image[i][j][2] = 0;
Image[i][j][3] = i;
}
Je vais sauter sur la majeure partie de créer et lier la texture, le réglage des paramètres , etc.Et obtenir directement à dessiner un couple de quartes avec la texture:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBegin(GL_QUADS);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
glColor4f(0.0, 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
glBegin(GL_QUADS);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, 1.0f, 0.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, -1.0f, 0.0f);
glColor4f(0.0, 0.0f, 1.0f, 1.0f);
glTexCoord2f(0.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
glEnd();
Ce produit:
Ainsi, à gauche où il est dessiné avec GL_REPLACE, nous obtenons le vert de la texture, mais sur la droite, où il est dessiné avec GL_BLEND (et glBlendFunc a été configuré pour utiliser uniquement le canal alpha), nous obtenons le quad bleu, mais avec son Alpha pris dans la texture - mais nous utilisons exactement la même texture.
Edit 2: Si vous décidez avez vraiment besoin d'une texture qui est tout blanc, je venais de créer une texture de 1 pixel, et mis GL_TEXTURE_WRAP_S et GL_TEXTURE_WRAP_T à GL_REPEAT. Même si cela utilise encore une texture supplémentaire, cette texture supplémentaire sera vraiment minuscule, car il est seulement un pixel. Le temps pour le charger et la mémoire consommée seront vraiment minuscules - les données pour le pixel sont fondamentalement "bruit". Je n'ai pas essayé de tester, mais vous pourriez être mieux avec quelque chose comme un bloc de pixels 8x8 ou 16x16 à la place. C'est encore si petit que cela compte à peine, mais ce sont les tailles utilisées respectivement en JPEG et MPEG, et je peux voir où la carte et (surtout) le pilote pourrait être optimisé pour eux. Cela pourrait aider, et ne fera pas de mal (assez pour se soucier de toute façon).
Qu'essayez-vous d'accomplir? Pourquoi faire une nouvelle texture comme vous le suggérez pas une bonne solution? – shoosh
Parce qu'il deviendra plus lent à charger et prend deux fois plus de mémoire, et je demande un meilleur moyen, car je ne sais pas s'il existe une meilleure façon. – Newbie
Juste pour un peu plus de clarification, ce que vous essayez d'accomplir est (une partie du temps, pas toujours) ignorer la couleur et juste utiliser le canal alpha de la texture, correct? –