Frage

Ich habe versucht, dies auf Google zu erforschen, aber es scheint nicht zu mir keine kohärente einfache Antworten zu sein. Ist das, weil es nicht einfach ist, oder weil ich nicht die richtigen Keywords?

Das ist doch die Fortschritte, die ich bisher gemacht habe.

  1. Erstellt 8 Eckpunkten 2 Quadrate zu bilden.
  2. eine Textur mit einem 200-Bit-Alpha-Wert geführt (so etwa 80% transparent).
  3. Assigned die gleiche Textur auf jeden Platz, der richtig zeigt.
  4. Bemerkt, dass wenn ich eine Textur mit 255 Alpha verwenden, es erscheint heller.

Die init ist in etwa wie folgt:

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

Dies ist ähnlich den Code-Snippet von Seite 417 im Buch OpenGL Programming Guide , und erstellt einen Karomuster.

Und dann die Anzeigefunktion enthält ...

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

Also, macht dies einen zweiten Platz in den Hintergrund; Das kann ich sehen, aber es sieht aus wie sie mit dem Hintergrund vermischt sind sein (ich dies übernehmen, weil sie als 255 etwas dunkler mit 200 Bit Alpha sind) anstelle der Textur hinter ...

Transparent Texturen nicht funktioniert

Wie Sie sehen können, keine Transparenz ... Wie kann ich dieses Problem beheben?

War es hilfreich?

Lösung

So ist die andere Antwort, die hier war, aber dies erwähnt gelöscht - Im Allgemeinen für Alpha-Blending richtig arbeiten zu können, von Ferne in die Nähe der Objekte sortieren, müssen im Koordinatensystem der Kamera
. Deshalb ist Ihre Polygone werden mit dem Hintergrund gemischt. Sie können bestätigen, dass dies in der Tat das Problem durch den Tiefentest zu deaktivieren. Ohne Tiefentest alle werden die Fragmente angezeigt, und Sie werden in der Lage sein, den Alpha-Blending zu sehen.

Mehr dazu im dieser Seite.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top