2009-08-23 16 views
2

Dies ist mit meinem letzten question verwandt. Um dieses Bild:Image Blending Problem beim Rendern auf Textur

http://img252.imageshack.us/img252/623/picture8z.png

  1. ich einen weißen Hintergrund zeichnen (color = (1, 1, 1, 1)).

  2. I Render-to-Textur, die beiden oberen linken Quadrate mit color = (1, 0, 0, .8) und Vermischungsfunktion (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) und dann mit Farbe, die Textur zeichnen = (1, 1, 1, 1) und Vermischungsfunktion (GL_ONE, GL_ONE_MINUS_SRC_ALPHA).

  3. Ich zeichne das untere rechte Quadrat mit Farbe = (1, 0, 0, .8) und Mischfunktion (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).

Durch meine Berechnung, die Render-to-Textur Quadrate

.8 * (1, 0, 0, .8) + (1 - .8) * (0, 0, 0, 0) = (.8, 0, 0, .64) 

und so nach, dass die Textur auf dem weißen Hintergrund zeichnen, sollten sie Farbe haben Farbe sollte

(.8, 0, 0, .64) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84) 

und das untere rechte Quadrat sollte die Farbe haben

.8 * (1, 0, 0, .8) + (1 - .8) * (1, 1, 1, 1) = (1, .2, .2, .84) 

das sollte gleich aussehen! Ist meine Argumentation falsch? Ist meine Berechnung falsch?

In jedem Fall ist mein Ziel, einige meiner Szene zu cachen. Wie rendere ich die Textur und zeichne diese Textur so, dass sie der Inline-Szene entspricht?

Antwort

4

Wenn Sie einen gemischten Inhalt zu einer Textur rendern und diese Textur auf dem Bildschirm zusammensetzen möchten, ist der einfachste Weg die Verwendung von Alpha-Multiplem überall. Es ist relativ einfach zu zeigen, dass dies für Ihren Fall funktioniert: Die Farbe Ihrer halbtransparenten Quadrate in vorgemerkleinerter Form ist (0,8, 0, 0, 0,8) und diese über (0, 0, 0, 0) mit (GL_ONE ,) übergibt die Farbe Ihrer Quadrate im Wesentlichen an die Textur. Mischen (0,8, 0, 0, 0,8) über Deckweiß mit (GL_ONE, GL_ONE_MINUS_SRC_ALPHA) gibt Ihnen (1,0, 0,2, 0,2, 1,0). Beachten Sie, dass die Farbkanäle der dritten Berechnung entsprechen, der Alphakanal jedoch immer noch 1,0 ist, was Sie für ein undurchsichtiges Objekt erwarten würden, das von einem überblendeten Objekt abgedeckt wird.

Tom Forsyth hat eine gute article über premultipliziert alpha. Das Ganze ist lesenswert, aber im Abschnitt "Compositing translucent layers" finden Sie eine Erklärung, warum die Mathematik im allgemeinen Fall funktioniert.

0

Whoops, meine Berechnung ist falsch! die zweite Zeile sollte

(.8, 0, 0, .64) + (1 - .64) * (1, 1, 1, 1) = (1, .36, .36, .84) 

sein, die in der Tat zu passen scheinen, was ich sehe (wenn ich den letzten Platz ändern (1, .2, .2, .8) alle drei Quadrate erscheinen die gleiche Farbe Farbe).

0

In Bezug auf Ihre letzte Frage: Ersetzen von Teilen der Szene durch Texturen ist nicht trivial. Ein guter Startpunkt ist Stefan Jeschkes PhD thesis.

Verwandte Themen