2010-07-02 23 views
7

Ich habe eine 2 png Bilder, als Texturen in einer Qt/C++ 2D OpenGL-Anwendung verwendet. Der erste wird als eine Art "mittlerer" Grund verwendet und der zweite als ein "Objekt", das "ontop" gerendert wird (Anmerkung: sie alle haben den gleichen Z-Wert atm, ich bekomme das gewünschte Verhalten, rendere es in a definierte Reihenfolge). Die "Objekt" -Textur ist teilweise durchscheinend. Die "Mittelgrund" -Textur ist meist massiv. Das Problem ist, dass der durchscheinende Teil meiner "Objekt" -Textur die feste Hintergrundfarbe und nicht die "Mittelgrund" -Textur hat.OpenGL transluzente Textur über andere Textur

Irgendwelche Tipps, wie Sie dies erreichen?

Nach OpenGL falgs sind für meine Texturen verwendet

glEnable (GL_TEXTURE_2D); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Vielen Dank für jede Hilfe zu machen.

Edit:

Weitere Code:

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 

glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 

glEnable(GL_ALPHA_TEST); 
glAlphaFunc(GL_GREATER, 0.1f); 

glEnable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glBindTexture(GL_TEXTURE_2D, c->_texture); 

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

glBegin(GL_QUADS); 
{ 
    glTexCoord2i(0,0); 
    glVertex2i(-128,-128); 

    glTexCoord2i(0,1); 
    glVertex2i(-128,128); 

    glTexCoord2i(1,1); 
    glVertex2i(128,128); 

    glTexCoord2i(1,0); 
    glVertex2i(128,-128); 

} 
glEnd(); 

glDisable(GL_TEXTURE_2D); 

glDisable(GL_ALPHA_TEST); 
glDisable(GL_DEPTH_TEST); 

Edit: Wie kann ich meine Textur laden und so weit ich es lädt es Kanal

mit alpha sagen kann
QImage img("./images/dummycar.png","PNG"); 
QImage t(QGLWidget::convertToGLFormat(img)); 
glGenTextures(1, &_texture); 
glBindTexture(GL_TEXTURE_2D, _texture); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

Screenshot : http://img824.imageshack.us/img824/1912/blackbox.png

Das Himmelsbild ist der "Mittelgrund", der Hintergrund ist schwarz.

+0

Screenshots mit Erklärungen wäre nett. – SigTerm

Antwort

7
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 

Sie spezifizieren 3 Kanäle für die internalFormat, so dass RGB ist, nicht RGBA. Verwenden Sie stattdessen GL_RGBA in dieser Position.

+1

Ich wusste, dass es etwas Dummes war. Vielen Dank, das hat meinen Tag gerettet :) – drahnr

4

Haben Sie versucht, mit glAlphaFunc fummeln? Sie können damit durchscheinende Teile Ihrer Objekttextur basierend auf dem Alpha-Wert verwerfen.

Was ist entweder

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

oder

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)?

Ich hoffe, dass hilft.

+0

Das hat nicht funktioniert. Ich habe versucht glEnable (GL_ALPHA_TEST); glAlphaFunc (GL_GREATER, 0.1f); aber keine Veränderung. GL_MODULATE änderte nichts, GL_BLEND änderte die Farbe, aber die "Box" um mein Objekt war immer noch da – drahnr

+1

Das war sehr hilfreich für mich. Mit BB, als ich den Alpha-Test aktivierte und GL_GREATER verwendete, funktionierte es wie ein Zauber. – bobobobo

3

Wenn Sie eine Textur pro Objekt rendern, müssen Sie glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) verwenden.

Wenn die Textur auch danach noch "umrahmt", dann wurde sie ohne Alpha-Kanal geladen.

Dies funktioniert perfekt für mich:

glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glBindTexture(GL_TEXTURE_2D, texture2->tex); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glColor4f(0.5f, 1.0f, 0.5f, 0.5f); 
    glBegin(GL_TRIANGLE_FAN); 
    glTexCoord2f(0, 0); 
    glVertex2f(x, y); 
    glTexCoord2f(1, 0); 
    glVertex2f(x + texture2->width, y); 
    glTexCoord2f(1, 1); 
    glVertex2f(x + texture2->width, y+ texture2->height); 
    glTexCoord2f(0, 1); 
    glVertex2f(x, y + texture2->height); 
    glEnd(); 
    glDisable(GL_BLEND); 

semitransparente Textur, durch letzte Farbe getönt.

Wenn "eine Box um die Textur herum" Ihr Problem nicht beschreibt, müssen Sie Screenshots posten.

--EDIT--

Aktualisierte Daten basierend auf your screenshot.

Sie müssen FIRST render Hintergrund und dann das Auto rendern. Sie sehen Hintergrundfarbe, denn selbst wenn die Oberfläche transparent ist, füllt sie den Z-Puffer mit Werten, und da der Hintergrund unter dem Auto liegt, wird er unsichtbar.

Wenn Sie halbtransparente Objekte rendern, müssen Sie diese Regeln befolgen.

  1. Alle nicht transparenten Objekte sollten vor halbtransparenten Objekten gerendert werden. Immer.

  2. Alle transparenten Objekte sollten im Objekt von hinten nach vorne gerendert werden. Die am weitesten entfernten Objekte sollten zuerst gerendert werden, die nächsten Objekte sollten als zweites gerendert werden.

  3. Wenn das Rendern in umgekehrter Reihenfolge nicht möglich ist (unsortierte Partikel mit der Mischung GL_ADD), sollte das Schreiben in den Tiefenpuffer mit glDepthMask (GL_FALSE) deaktiviert werden. Wenn Sie es nicht tun, werden Sie hässliche Artefakte bekommen. (wie der auf Ihrem Screenshot).

+0

Zeigt dies die zugrunde liegenden Texturen? Bis jetzt funktioniert es auch für mich, aber mein Problem ist, dass ich ein anderes Texturobjekt sehen möchte _beyond_ das, das ich zeichne. Aber atm bekomme ich stattdessen die Hintergrundfarbe (schwarz). Screenshot: http://img824.imageshack.us/img824/1912/blackbox.png – drahnr

+0

@ soxs060389: Ich habe meine Antwort aktualisiert. Sie sollten FIRST den Boden rendern und NACHDEM das Auto rendern. Es wird nicht funktionieren, wenn Sie es in umgekehrter Reihenfolge tun. – SigTerm

+0

Ich machte das seit Stunde zer0. Das Auto ist und war immer der letzte Gegenstand, der gerendert wurde. – drahnr