2009-06-16 6 views
2

Wie interpoliere ich effizient zwei Texturen A und B pro Pixel durch eine dynamische Textur C und zeichne sie auf einem einfachen Quad? Multi-Pass-Algorithmen akzeptiert.Interpolation von zwei Texturen durch eine dritte Textur (Faktor ist in Helligkeit, nicht Alpha)

Ich hatte mäßigen Erfolg bei der Berechnung der C-Textur pro Frame auf der CPU und beim Hochladen mit glTexImage2D in eine Alpha-only-Textur.

Während dies funktionierte, fehlte die Leistung und ich musste die Abmessungen von C auf die Hälfte der vollen Größe reduzieren, um den Engpass bei der Kopierbandbreite zu umgehen.

Aus Gründen der Leistung versuche ich alle meine C-Textur-Updates mit Render-to-Texture zu tun.

ich war in der Lage, die notwendigen Puffer für das Rendering, aber im Grunde einzurichten, bekomme ich eine Textur in RGB oder RGBA-Format mit dem Maske codierte in Leichtigkeit/RGB-Informationen, nicht alpha.

Wie konvertiere ich das effizient in die Alpha-Textur, die ich in die Texturing-Pipeline einstecken muss? Denken Sie daran, dass es keine programmierbare Pipeline (Shader) und nur zwei Textureinheiten auf dem iPhone gibt.

Aktualisierung: A und B sind nur RGB-Texturen, dh kein Alpha.

Antwort

6

Vorausgesetzt, dass die Texturen A und B RGB-Bilder sind, dann können Sie möglicherweise eines davon zu einem RGBA-Bild machen und die Maske im Alphakanal eines Bildes rendern. Dies bringt Sie innerhalb der Grenze des iPhone von zwei Textur-Einheiten, so dass Sie dies in einem Durchgang tun können, ohne zu mischen.

GLSL Pseudo-Code:

vec4 a = texture2D(textureA, texcoord); 
vec4 b = texture2D(textureB, texcoord); 
gl_FragColor = vec4(a.rgb * a.a + b.rgb * (1-a.a), dont_care.a); 

Texture Environment for Einheit 0: (Proben RGB-Bild B, und übergibt sie an die nächste Stufe auf)

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textureB); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

Texture Umgebung für Einheit 1: (image B sind in Cp und 'Ap' Quelle verfügbar. A ist in 'Cs' verfügbar. Maske ist in 'As' verfügbar (siehe Tabelle 3.15 in der GL-Spezifikation).

Lesen Sie den Abschnitt 3.7.12 Texturumgebungen und Texturfunktionen in der OpenGL ES 1.1 Spezifikation für weitere Informationen.

Um Ihre Szene tatsächlich in den Alpha-Kanal des Bildes zu rendern, kann es hilfreich sein, glColorMask() zu verwenden, um nur den Alpha-Kanal schreiben zu lassen. Wie Sie die Daten tatsächlich in diesen Kanal bekommen, hängt davon ab, was genau Sie zeichnen, um diese Maske zu generieren.

+0

Ehrfürchtige Post. Dachte daran, so etwas zu tun. Weder A noch B haben einen Alpha-Kanal. Wie kann ich "C in den unbenutzten Alpha-Kanal eines Bildes rendern"? –