Question

Est-il possible de désactiver les couleurs de texture, et utiliser uniquement le blanc comme couleur? Il lisait encore la texture, donc je ne peux pas utiliser glDisable (GL_TEXTURE_2D) parce que je veux rendre aussi les canaux alpha.

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

Je dois le faire sans shaders , donc est-ce même possible?

Modifier pour préciser: je veux utiliser les deux textures:. Couleurs blanc et normal

Edit: APPAREMMENT PAS POSSIBLE CECI EST

Était-ce utile?

La solution

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 bitmaps en mémoire à un moment donné, il devrait être facile et vous aurez pas besoin de fichiers de texture séparés.

Autres conseils

Je ne suis toujours pas tout que je comprends bien ce que vous voulez, mais je vais vous donner un coup de feu. 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 (à peu près) le même format pour les deux - par exemple vous aurez généralement utiliser 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 près 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 utiliser 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 sur une surface, il va affecter seulement l'alpha, pas la couleur. Cela permet non seulement évite de faire une copie supplémentaire de vos texels, mais (au moins en général) réduit la mémoire consommée par la texture elle-même aussi bien, car il ne comprend que un canal alpha, pas les trois canaux de couleur.

Edit: D'accord, d'y penser un peu plus, il y a un moyen de faire ce que (je pense) que vous voulez, en utilisant seulement une texture. Tout d'abord, vous définissez la fonction de mélange juste utiliser le canal alpha, lorsque vous voulez copier la couleur de la texture, vous appelez glTextureEnvf avec GL_REPLACE, mais quand vous voulez seulement utiliser le canal alpha, vous l'appelez avec GL_BLEND. Par exemple, nous allons créer une texture verte, et le dessiner (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 passer 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();

produit:

Textures Blended

Alors, à gauche où il est dessiné avec GL_REPLACE, nous obtenons le vert de la texture, mais à 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 de la texture -. mais nous utilisons exactement la même texture pour les

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. Bien que ce soit encore en utilisant une texture supplémentaire, cette texture supplémentaire sera vraiment minuscule, car il n'y a qu'un seul pixel. Tant le temps de le charger et la mémoire consommée sera vraiment minuscule - les données pour le pixel est essentiellement « bruit ». Je ne l'ai pas essayé de tester, mais vous pourriez être mieux avec quelque chose comme un bloc de 8x8 ou 16x16 pixels de la place. Ceci est encore si petit, il importe peu, mais ce sont les tailles utilisées au format JPEG et MPEG respectivement, et je peux voir où la carte et le conducteur (en particulier) pourraient être optimisés pour eux. Il pourrait aider, et ne fera pas mal (assez pour se soucier de toute façon).

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