# Alpha Blending (jogl)



## JavaKing (22. Sep 2008)

Hallo zusammen,

ich habe versucht das sogenannte Alpha Blending einzubauen. Die Tischplatte wird einmal ohne und einmal mit Alpha Blending in eine DisplayListe geschrieben. Das Alpha Blending funktioniert soweit ganz gut, nur habe ich das Gefühl das auch die anderen Objekte beeinflusst werden. Ich zeichne die Tischplatte allerdings nach allen anderen Objekten.
Was könnte hier noch schiefgelaufen sein ?



```
private void drawScene(GL gl, boolean select)// Hier kommt der ganze Zeichnen-Kram hin 
 { 
        gl.glPushMatrix();
        gl.glTranslated(0,-4,-6);
        if (tisch_texture){gl.glCallList(tisch);} // Tisch zeichnen
        else{gl.glCallList(tisch2);}
        gl.glPopMatrix();
}
```



```
// Tischplatte
        tischplatte2 = gl.glGenLists(1); 
        gl.glNewList(tischplatte2, GL_COMPILE);
          gl.glColor4f(1.0f,1.0f,1.0f,0.5f);// Volle Helligkeit, 50% Alpha ( NEU )
          gl.glBlendFunc(GL_SRC_ALPHA,GL_ONE);// Blending Funktion für Durchsichtigkeit basiered auf dem Quell Alpha Wert ( NEU )

          gl.glEnable(GL_BLEND);		//Turn Blending On
          gl.glDisable(GL_DEPTH_TEST);	// Turn Depth Testing Off  
          gl.glEnable(GL_TEXTURE_2D);
          text_tischplatte2.bind();

        w = 6+6; 
        h = 3+3; 
        xOffset = -6; 
        yOffset = -3; 
        segments = 200; 
        for (int x=0; x<segments; x++) { 
            for (int y=0; y<segments; y++)     { 
        // Relative Positionen der 4 Eckpunkte, alle zwischen 0 und 1 
        float rx0 = x * (1.0f / segments); 
        float ry0 = y * (1.0f / segments); 
        float rx1 = (x+1) * (1.0f / segments); 
        float ry1 = (y+1) * (1.0f / segments); 

        // Positionen der Expunkte des Rechtecks im Raum 
        float x0 = xOffset + rx0 * w; 
        float y0 = yOffset + ry0 * h; 
        float x1 = xOffset + rx1 * w; 
        float y1 = yOffset + ry1 * h; 

        gl.glBegin(GL_POLYGON); 
        gl.glNormal3f( 0.0f, 1.0f, 0.0f);
        gl.glTexCoord2f(rx0,ry1); gl.glVertex3f(x0, -3.0f, y1); //Punkt hinten links 
        gl.glTexCoord2f(rx0,ry0); gl.glVertex3f(x1, -3.0f, y1); //Punkt hinten rechts
        gl.glTexCoord2f(rx1,ry0); gl.glVertex3f(x1, -3.0f, y0); //Punkt vorne rechts
        gl.glTexCoord2f(rx1,ry1); gl.glVertex3f(x0, -3.0f, y0); // Punkt vorne links
        gl.glEnd(); 
    } 
}  
        gl.glDisable(GL_TEXTURE_2D);    
        gl.glDisable(GL_BLEND);		// Schalte Blending aus
	gl.glEnable(GL_DEPTH_TEST);	// Schalte Depth Testing an
        gl.glEndList();
```


----------



## Fancy (23. Sep 2008)

Moin,



			
				JavaKing hat gesagt.:
			
		

> nur habe ich das Gefühl das auch die anderen Objekte beeinflusst werden.



Die Aussage ist natürlich ein wenig schwammig, aber ich hoffe, das Du den Effekt beschreibst den ich meine und der genau hierdurch verursacht wird:



			
				JavaKing hat gesagt.:
			
		

> Ich zeichne die Tischplatte allerdings nach allen anderen Objekten.



OpenGL FAQ:


			
				OpenGL FAQ hat gesagt.:
			
		

> 15.050 Do I need to render my primitives from back to front for correct rendering of translucent primitives to occur?
> If your hardware supports destination alpha, you can experiment with different glBlendFunc() settings that use destination alpha. However, this won't solve all the problems with depth buffered translucent surfaces. The only sure way to achieve visually correct results is to sort and render your primitives from back to front.


Wenn Du Deine halbtransparente Tischplatte als letztes Objekt renderst, hast Du das Problem, das einfach über alle anderen Objekte drüber gerendert wird, unabhängig davon ob sie eigentlich durch diese Objekte verdeckt wäre und damit die Transparenz gar nicht zu tragen käme. 

Konkret: Soviel ich weis liegen auf Deiner Tischplatte die Würfel. Zeichnest Du die Tischplatte mit ausgeschaltetem Tiefentest wird die Transparenz der Tischplatte einfach über Deine Würfel gelegt, obwohl dies nicht korrekt ist, da die Würfel ja die Tischplatte an entsprechender Stelle verdecken. 

Wenn es also dieser Effekt ist (dies kann so wirken als ob die Würfel auch eine gewisse Transparenz hätten), musst Du die Reihenfolge mit der Deine Objekte gerendert werden ändern. Zuerst die Objekte unter der Tischplatte (ohne GL_BLEND mit GL_DEPTH_TEST), dann die halbtransparente Tischplatte (ohne GL_DEPTH_TEST mit GL_BLEND)  und abschließend die Objekte auf Deiner Tischplatte (ohne GL_BLEND mit GL_DEPTH_TEST).

Gruß,
Michael


----------



## JavaKing (24. Sep 2008)

achso ok. Ich dachte ich muss die Tischplatte als letztes zeichnen. So hatte ich das verstanden. Das transparente im Prinzip zum Schluss....ok das ist wohl falsch.

Werde das jetzt so machen, Danke !


----------



## jtsfds385 (9. Okt 2008)

mammamia;


----------



## jtsfds137 (9. Okt 2008)

mammamia;


----------



## Illuvatar (9. Okt 2008)

Hier gibts ständig Spam, ihc hab vorhin schon 12 Beiträge gelöscht... ich glaub den Thread braucht eh niemand mehr, deshalb *closed*


----------

