Question

J'ai essayé de recherche sur Google, mais cela ne semble pas pour moi d'être des réponses simples cohérentes. Est-ce parce que ce n'est pas simple, ou parce que je ne suis pas en utilisant les bons mots-clés?

Néanmoins, c'est les progrès que je l'ai fait jusqu'à présent.

  1. créé 8 sommets pour former 2 carrés.
  2. Crée une texture avec une valeur alpha de 200 bits (donc environ 80% de transparence).
  3. Assigne la même texture à chaque carré, ce qui montre correctement.
  4. remarqué que lorsque j'utilise une texture avec 255 alpha, il apparaît plus lumineux.

Le init est quelque chose comme ce qui suit:

glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);

glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, textureIds);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

int i, j;
GLubyte pixel;
for (i = 0; i < TEXTURE_HEIGHT; i++)
{
    for (j = 0; j < TEXTURE_WIDTH; j++)
    {
        pixel = ((((i & 0x8) == 0) ^ ((j & 0x8) == 0)) * 255);
        texture[i][j][0] = pixel;
        texture[i][j][1] = pixel;
        texture[i][j][2] = pixel;
        texture[i][j][3] = 200;
    }
}

glBindTexture(GL_TEXTURE_2D, textureIds[0]);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    TEXTURE_WIDTH, TEXTURE_HEIGHT,
    0, GL_RGBA, GL_UNSIGNED_BYTE, texture);

Ceci est un peu similaire à l'extrait de code de la page 417 dans le livre, Guide de programmation OpenGL , et crée un motif de vérification.

Et puis, la fonction d'affichage contient ...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);

// Use model view so that rotation value is literal, not added.
glMatrixMode(GL_MODELVIEW);
glPushMatrix();

// ... translation, etc ...

glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, +1.0, 0.0); // top left
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); // bottom left
glTexCoord2f(1.0, 1.0); glVertex3f(+1.0, -1.0, 0.0); // bottom right
glTexCoord2f(1.0, 0.0); glVertex3f(+1.0, +1.0, 0.0); // top right
glEnd();

    // not neccecary to repeat, just good practice
glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, +1.0, -1.0); // top left
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -1.0, -1.0); // bottom left
glTexCoord2f(1.0, 1.0); glVertex3f(+1.5, -1.0, -1.0); // bottom right
glTexCoord2f(1.0, 0.0); glVertex3f(+1.5, +1.0, -1.0); // top right
glEnd();

glFlush();
glDisable(GL_TEXTURE_2D);

glPopMatrix();

SwapBuffers();

Alors, cela rend un carré 2 en arrière-plan; Je peux voir cela, mais on dirait qu'ils sont être mélangés avec l'arrière-plan (je suppose parce qu'ils sont plus sombres avec 200 bits alpha à 255 bits) au lieu de la texture derrière ...

textures transparentes ne fonctionne pas

Comme vous pouvez le voir, pas de transparence ... Comment puis-je résoudre ce problème?

Était-ce utile?

La solution

autre réponse qui était ici, mais a été supprimée mentionné - En général, pour le mélange alpha pour fonctionner correctement, vous devez trier les objets de loin à proximité du système de coordonnées de la caméra
. Ceci est la raison pour laquelle vos polygones sont mélangés avec l'arrière-plan. Vous pouvez confirmer que tel est bien le problème en désactivant le test de profondeur. Sans test de profondeur tous les fragments sont affichés et vous serez en mesure de voir le mélange alpha.

En savoir plus sur ce cette page.

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