Pergunta

Eu tentei pesquisar isso no Google, mas não parece-me ser quaisquer respostas simples coerentes. É este, porque não é simples, ou porque eu não estou usando as palavras-chave corretas?

No entanto, este é o progresso que eu fiz até agora.

  1. Criado 8 vértices para formar 2 quadrados.
  2. Criado uma textura com um valor alfa de 200 bits (assim, cerca de 80% transparente).
  3. Atribuído a mesma textura para cada quadrado, o que mostra corretamente.
  4. notado que quando eu usar uma textura com 255 alfa, parece mais brilhante.

O init é algo como o seguinte:

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

Este é um pouco semelhante ao trecho de código a partir da página 417 do livro, OpenGL Guia de Programação , e cria um modelo de verificação.

E, em seguida, a função de exibição contém ...

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();

Então, isso torna a 2º quadrado no fundo; Eu posso ver isso, mas parece que eles estão sendo misturados com o fundo (eu assumo isso porque eles são mais escuras com alfa 200 bit de 255 bits) em vez da textura trás ...

texturas transparentes não funciona

Como você pode ver, há transparência ... Como posso corrigir isso?

Foi útil?

Solução

Então, a outra resposta que era aqui, mas foi eliminado mencionado isso -. Geralmente, para mistura alfa para o trabalho será necessário para classificar os objetos de longe para perto no sistema de coordenadas da câmera
É por isso que os polígonos são misturados com o fundo. Você pode confirmar que este é verdadeiramente o problema, desativando o teste de profundidade. Sem teste de profundidade todos os fragmentos são exibidos e você será capaz de ver a mistura alfa.

Mais sobre isso em desta página.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top