2010-11-28 8 views
0

Ich versuche, eine Textur mit Alpha zu einem Bildspeicher mit Alpha zu rendern. Ich brauche die Transparenz der Textur, die durch eine Kombination aus ihrem eigenen Alpha und dem bereits in den Bildpuffer gerenderten Alpha gesteuert wird.OpenGL Blending mit Quell-und Ziel Alpha

dh:

Normale Transparenz:

(src_colour * src_alpha) + (dst_colour * 1-src_alpha)

Notwendige Transparenz:

(src_colour * src_alpha * dst_alphe) + (dst_colour * 1- (src_alpha * dst_alpha))

Kann jemand herausfinden, wie man das macht?

Ich habe jetzt :-) 9 Stunden daran gearbeitet

Ich bin mit OpenGL 1.0 mit GL11ExtensionPack auf Android, so habe ich Zugang zu glBlendFunc und glBlendFuncSeparate. Ich würde es vorziehen, die GLES20-Route nicht mit Shadern zu gehen, da dies viel Code zum Umschreiben erfordern würde.

Danke, Andrew

+0

Standard GL Blending unterstützt dies nicht. Shaders auch nicht (in einem einzigen Durchgang). Was versuchst du zu erreichen? Es könnte andere Wege geben. – Bahbar

+0

Das Spiel ist ein vertikal scrollendes Shoot-em-up, von oben betrachtet. Szenen, Raumschiffe, Raketen usw. werden im Vordergrund gerendert, mit einem Himmel und Sternenfeld im Hintergrund. Dann gibt es Details wie Gebäude, die der Szenerie hinzugefügt wurden und Schatten werfen. (Schatten sind in die Texturen eingebacken.) Ich brauche die Schatten, um nur den Vordergrund und nicht den Hintergrund zu beeinflussen. Ich habe dies mit einem Stencil-Buffer erreicht, aber einige der Sprites im Spiel haben Alpha-Transparenz, so dass die binäre Ein/Aus-Lösung des Stencil-Buffers nicht ausreichend war. Die Schatten müssen sich vermischen. –

Antwort

1

Dies ist die Lösung, die ich verwendet habe:

  1. ermöglichen Farb- und Alpha schreibt
  2. glBlendFunc (GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA)
  3. Vordergrund render Objekte
  4. Disabe Alpha schreibt
  5. render Schatten
  6. Objekte wiedergeben, die auf Objekte im Vordergrund erscheinen Schatten
  7. glBlendFunc (GL10.GL_ONE_MINUS_DST_ALPHA, GL10.GL_DST_ALPHA)
  8. render Hintergrundobjekte

Dies erzeugt den gewünschten Effekt von Schatten nur werfen. Effektiv wird der Alpha-Puffer zu einem Schablonenpuffer mit variabler Opazität.

Es ist ein Glück, dass meine Hintergrundobjekte keine Transparenz haben, als ob ich glaube, dass es keine Möglichkeit gibt, diesen Effekt ohne die Verwendung von Shadern zu erreichen.