JOGL: Problem mit Blending bei Billboards (Transparenz)

  • Themenstarter Themenstarter Inqui
  • Beginndatum Beginndatum
I

Inqui

Gast
hallo,

ich habe folgendes problem:

ich habe eine Szene erstellt, in der aus einer Shape-Datei Koordinaten von Bäumen ausgelesen werden.
In die Szene wird, an jedem in der Shape-Datei gefundenen Punkt, ein erstelltes Billboard gesetzt und eine entsprechende Baum-Textur geladen. Soweit funktioniert das.
Allerdings möchte ich natürlich, dass die Billboards selbst (2 rechteckige, überkreuzte Flächen) völlig transparent sind, sodass der Eindruck entsteht, dort stünden nur Bäume (also die Textur soll sichtbar sein).

nach langer recherche bin ich auf GL_BLEND gestoßen und BlendFunc, die scheinbar dafür geeignet sind, allerdings verändern sie an meiner Szene nichts.

hier der Ausschnitt aus meinem Code:

Java:
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_LIGHT0);
GL11.glEnable(GL11.GL_DEPTH_TEST);
		
//Feature for Billboards
final Feature feat = new Feature();
Model mod = new Model();
FaceSet fs = new FaceSet();
fs.setAppearance(plataneAppearance);
			
Face billA = new Face();				
Vertex[] points = new Vertex[4];
				
//Mittelpunkt des Baumstandorts aus Shapefile abzueglich 
//halber Stammdicke ist Ecke eines Billboards
points[0] = new TexturedVertex(new Point3D(p2d.getX() - krone/2, p2d.getY(), 0),
					new TextureCoordinate(0.0f, 0.0f));
points[1] = new TexturedVertex(new Point3D(p2d.getX() + krone/2, p2d.getY(), 0),
					new TextureCoordinate(1.0f, 0.0f));
points[2] = new TexturedVertex(new Point3D(p2d.getX() + krone/2, p2d.getY(), hoehe/10),new TextureCoordinate(1.0f, 1.0f));
points[3] = new TexturedVertex(new Point3D(p2d.getX() - krone/2, p2d.getY(), hoehe/10),new TextureCoordinate(0.0f, 1.0f));
billA.setVertices(points);
								
		//An der Stelle noch 3 weitere Teile für das Billboard		
				
fs.addFace(billA);
fs.addFace(billAb);
fs.addFace(billB);
fs.addFace(billBb);			
				
mod.addChild(fs);
feat.addModel(mod);
		

				
scene = (ISceneService)PlatformUI.getWorkbench().getService(ISceneService.class);
Display.getDefault().syncExec(new Runnable() {
     public void run() {
	scene.add(feat);						
	}
					
				
});		
GL11.glEnable (GL11.GL_BLEND);
GL11.glDepthMask (false);
GL11.glBlendFunc (GL11.GL_ZERO, GL11.GL_ONE);				
GL11.glDepthMask (true);
GL11.glDisable (GL11.GL_BLEND);
 
Falls Fancy nicht noch hier reinschaut (was er sicher tut 🙂 ) : Transparente Sachen zu Rendern ist ein bißchen aufwändiger. Man muss einmal die gesamte Szene Rendern, und danach die transparenten Sachen, dazwischen die richtigen Blend-modi einschalten, und immer auf den z-Buffer aufpassen: Nur weil etwas HINTER dem Transparenten liegt, heißt das ja nicht, dass es nicht gerendert werden muss...
 
Moin, (ja, da bin ich 😀)

neben dem was Marco schon schrieb, fehlt (glaube ich) auch noch ein wenig allgemeines OpenGL Verständnis. OpenGL ist im Wesentlichen eine Zustandsmaschine. Das heißt Du setzt einen Zustand und zeichnest das passende Objekt, dann setzt Du den nächsten Zustand und zeichnest das nächste Objekt usw.

In Deinem Code oben, aktivierst Du in Zeile 45 das Blending und deaktivierst es in Zeile 49 wieder, ohne dazwischen etwas zu zeichnen. Das zeichnen der Bäume müsste also theoretisch in Zeile 47,5 erfolgen. (Praktisch musst Du vermutlich Deinen Code etwas ummodeln / vermutlich verstecken sich noch weitere Fehler... (siehe Hinweise von Marco))

Allgemein bin ich allerdings auch etwas von Deinem Code verwirt, das sieht mir nicht nach JoGL aus. JoGL hat keine statischen OpenGL Funktionen. Vermutlich nutzt Du LWJGL. (Ist nichts dramatisches – ist schließlich auch OpenGL 😉 )

Gruß,
Fancy
 

Neue Themen


Zurück
Oben