2010-03-22 6 views
3

Est-il possible de désactiver les couleurs de texture et d'utiliser uniquement du blanc comme couleur? Il serait toujours lire la texture, donc je ne peux pas utiliser glDisable (GL_TEXTURE_2D) parce que je veux rendre les canaux alpha aussi.OpenGL: Désactive les couleurs de texture?

Tout ce que je peux penser maintenant est de faire une nouvelle texture où toutes les données de couleur sont blanches, restant alpha tel qu'il est.

Je dois faire cela sans shaders, est-ce encore possible?

Modifier: pour clarifier: je veux utiliser les deux textures: couleurs blanches et normales.

Edit: APPAREMMENT PAS POSSIBLE CECI EST

+0

Qu'essayez-vous d'accomplir? Pourquoi faire une nouvelle texture comme vous le suggérez pas une bonne solution? – shoosh

+0

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

+0

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? –

Répondre

1

Qu'en est-il de changer toutes les couleurs de texture (sauf alpha) au blanc après leur chargement et avant qu'ils ne soient utilisés dans OpenGL? Si vous les avez sous forme de bitmaps en mémoire à un moment donné, cela devrait être facile et vous n'aurez pas besoin de fichiers de texture séparés.

+0

mais j'ai besoin d'utiliser les textures aussi.Je veux une option pour l'afficher en blanc – Newbie

+0

@Newbie, faire une copie de la texture.Il faudra deux fois la mémoire, Je sais que vous essayez d'éviter, mais au moins vous avez seulement besoin de charger une copie à partir du disque, et il est DRY –

4

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:

Blended Textures

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).

+0

Je ne comprends pas comment je suis supposé lire uniquement canal alpha sur l'exécution, code pls. im en utilisant le code glBindTexture (GL_TEXTURE_2D, tex); pour lier la texture, quoi d'autre ai-je besoin de lire seulement alpha? Im en utilisant glTexImage2D (target, 0, format, largeur, hauteur, 0, format, GL_UNSIGNED_BYTE, pixels), pour sauvegarder la texture sur mon GPU. cela ne peut pas être utilisé sur le temps d'exécution, je ne peux pas faire double de t sa fonction ou cela créerait une autre texture. – Newbie

+0

comment puis-je rétablir GL_TEXTURE_ENV_MODE à ce qu'il était avant les modifications? aussi il y a un problème, je dois faire ce travail avec et sans GL_BLEND, où je peux voir la couleur blanche sans alpha, et avec alpha. – Newbie

+0

Pour revenir à GL_REPLACE, vous appelez à nouveau 'glTexEnvf' avec' GL_REPLACE'. Je ne pense pas comprendre le reste de ce que vous voulez, donc je ne peux pas vraiment répondre. Si vous voulez juste un bloc blanc, sans utiliser les couleurs ou l'alpha de la texture, pourquoi utiliser une texture? C'est juste un GL_QUAD avec la couleur en blanc ... –