OpenGL-transluzente textur über die andere textur
Bekam ich ein 2 png-Bilder, die als Texturen in ein Qt/C++ - 2D-OpenGL-Anwendung. Der erste dient als eine Art "mittlerer" Boden und die zweite wird als ein "Objekt" gerendert "ontop" (Hinweis: Sie haben alle den gleichen z-Wert atm, bekomme ich das gewünschte Verhalten zu sein, dass es in einer definierten Reihenfolge). Das "Objekt"-textur ist teilweise lichtdurchlässig. Den "middleground" textur ist meist solide.
Das problem ist, dass das lichtdurchlässige Teil von meinem "Objekt" textur macht die Hintergrundfarbe und nicht den "middleground" textur.
Irgendwelche Tipps, wie dies zu erreichen?
Folgenden OpenGL-falgs sind für meine Texturen Rendern
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.
Edit:
Mehr 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 lade ich meine textur und soweit ich sagen kann, es lädt, es mit alpha-Kanal
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
Den Skyimage ist den "middleground", der hintergrund ist schwarz.
- Screenshots mit Erklärungen wäre schön.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bist du angeben
3
Kanäle für dieinternalFormat
, so dass die RGB -, nicht RGBA. Versuchen Sie es mitGL_RGBA
in dieser position statt.Haben Sie versucht, das hantieren mit glAlphaFunc? Sie können es verwenden, zu verwerfen Zeichnung durchscheinenden Teile des Objekt-textur basierend auf der alpha-Wert.
Was entweder
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)
oder
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
?Ich hoffe, das hilft.
Wenn Sie das Rendern einer textur pro Objekt, dann müssen Sie glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE).
Wenn die textur noch "box" um es auch danach, dann wurde es geladen, ohne alpha-Kanal.
Diese perfekt funktioniert für mich:
Semi-transparente textur, getönt durch die Letzte Farbe.
Wenn "ein Feld um textur" beschreibt nicht dein problem, dann brauchst du zum posten von screenshots.
--EDIT--
Aktualisierten Daten, basierend auf Ihr screenshot.
Müssen Sie ZUERST das render-hintergrund, und dann machen Sie das Auto.
Sehen Sie hintergrund-Farbe, denn auch, wenn die Oberfläche transparent ist, füllt z-buffer mit Werte, und da im hintergrund ist unter dem Auto, wird es unsichtbar.
Wenn Sie die rendering-semi-transparente Objekte, die Sie benötigen, diese Regeln zu befolgen.
Alle nicht-transparenten Objekte gerendert werden soll, bevor semi-transparente Objekte. Immer.
Alle transparenten Objekte gerendert werden, die von hinten nach vorne-Objekt. Weitesten entfernten Objekte, die gerendert werden soll zunächst, am nächsten Objekte gerendert werden sollte zweiten.
Wenn das rendering im back-to-front Reihenfolge ist nicht möglich (unsortiert Teilchen mit GL_ADD blend), das schreiben in den Tiefenpuffer deaktiviert werden sollten, mit glDepthMask(GL_FALSE). Wenn Sie es nicht tun, bekommen Sie hässliche Artefakte. (wie das auf deinem screenshot).