2016-03-22 6 views
1

STUMME quetion ziehen, aber ich kann es nicht löschen .. ich das Problem gelöst haben, bin ich ein Idiot ...: DBox2D Lichter machen zwischen scene2d Schauspieler

Ich habe Libgdx scene2d Bühne mit Schauspieler. Ich brauche die Box2D Lichter machen zwischen den Akteuren, so würde die Struktur wie folgt aussehen (v 1.4.):

Schauspieler, Schauspieler, Licht, Licht, Schauspieler

Meine Bühne machen:

Gdx.gl.glClearColor(0, 0, 0, 1); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
super.render(); 

stage.act(); 
stage.draw(); 

Mein Box2D Code:

rayHandler = new RayHandler(world); 
rayHandler.setShadows(false); 

Box2D Update (ich habe eine Debug-Matrix becau Ich vergrößere es auf Pixel se der Welt der Physik in Weltkoordinaten (Meter) wiedergegeben wird, und dann):

public void updateWorld(float deltaTime) { 
world.step(deltaTime, 7, 7); 

// i know that this is not optimized to be called on every frame 
debugMatrix = new Matrix4(stage.getCamera().combined.cpy()); 
debugMatrix.scale(ratio, ratio, 1); 

rayHandler.setCombinedMatrix(debugMatrix); 
rayHandler.updateAndRender(); 
} 

Und das Licht:

new PointLight(rayHandler, 128, null, 10, 0, 3); 

Ok, jetzt hier ist, was ich tue: Ich habe eine Gruppe mit einigen Schauspielern. Ich habe eine andere Gruppe, die die Benutzeroberfläche enthält, über die erste Gruppe gezeichnet. Ich rufe updateWorld() gleich nach dem Zeichnen der ersten Gruppe auf, also werden die Lichter über der ersten Gruppe und hinter der zweiten Gruppe stehen.Hier ist eine kurze Darstellung:

die Zeichnung der Bühne starten

Schauspieler Gruppe

  • Schauspieler

  • Schauspieler

  • Schauspieler

Box2D machen aufgerufen (wir zeigen die Lichter hier)

UI Gruppe

  • UI Darsteller Panel

  • UI Darsteller Panel

  • UI Darsteller Panel

Beenden Sie die Zeichnung der Bühne

Hier wird das Ergebnis (sehr hässlich):

enter image description here

Jetzt ist hier, wie es aussieht, wenn ich updateWorld() aufrufen, nachdem die Phase beendet hat Zeichnung (nicht zwischen den Akteuren):

Gdx.gl.glClearColor(0, 0, 0, 1); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
super.render(); 

stage.act(); 
stage.draw(); 

updateWorld(deltaTime); 

enter image description here

Es sieht so aus, wie es aussehen sollte, aber es deckt die Bühne und die Benutzeroberfläche ab.

Jetzt gehen wir zurück zum Startpunkt - rufen Sie die updateWorld() erneut nach der Schauspielergruppe auf, während die Bühne gerendert wird.Wir ändern die Projektionsmatrix des Charge der Bühne:

debugMatrix = new Matrix4(stage.getCamera().combined.cpy()); 
debugMatrix.scale(ratio, ratio, 1); 

// this line was added 
stage.getBatch().setProjectionMatrix(debugMatrix.cpy()); 

rayHandler.setCombinedMatrix(debugMatrix); 
rayHandler.updateAndRender(); 

Das Ergebnis (Licht noch kühl ist, aber die scene2d gebrochen - alle Akteure aus der UI sind verschwunden):

enter image description here

ich habe viele, viele Dinge getestet (ich habe für 3 Tage eine Lösung zu finden versucht):

  • ich die Projektion verändert und die Transformationsmatrix;

  • Ändern Sie die Matrix, zeichnen Sie die Lichter und stellen Sie die vorherige Matrix wieder her;

  • Getestet mit verschiedenen Kameras und Vieports für die Bühne und die Lichter;

  • Und viele andere Dinge mit der Zeichnung der Bühne leuchtet Chargen- und Matrix

Ich denke, dass Libgdx die OpenGL verändert sich in irgendeiner Art und Weise zeichnen, während die Bühne gezogen wird. Ich weiß nicht, was zu tun ist, ich bin mir nicht ganz sicher, wie OpenGL funktioniert. Wie kann ich das Licht gut aussehen lassen (wie auf Screenshot 2 und 3)?

Update: Ich weiß, dass ich zwei getrennte Stufen machen und das Licht zwischen ihnen ziehen - das okay ist, aber meine Struktur ist viel komplexer (Ich habe gerade einfach es zu erklären) ... also kann ich nicht dazu (oder ich werde 4-5 verschiedene Stufen benötigen, was eine schreckliche Lösung ist)

Und bitte, schlagen Sie keine Lösungen vor, die keine Lösungen für das Problem sind. Ich kann nicht Shadern für Licht, mehr Stufen verwenden, exportierte Bilder von Lichtobjekten und so weiter ... Ich brauche eine Lösung für dieses Problem :)

+0

Wenn Sie es gelöst haben, warum nicht Ihre eigene Frage beantworten? – Sebastian

+0

Da ich dumm bin und das Problem nicht in opengl oder libgdx ist - es scheint, dass ich die updateWorld() -Methode aufgerufen habe/die die Lichter/10 Mal pro Frame zeichnet, nicht einmal wie ich sollte ..... –

Antwort

0

ich Shadern denke mit würde mehr niedriges Niveau Kontrolle geben, i habe noch nie box2d-lichter benutzt, aber die ergebnisse mit shadern sind mehr als befriedigend, voll steuerbar und es gibt viel zu optimieren.

+0

Ich möchte keine Shader, ich brauche box2d Lichter. Später werde ich physikalische Körper hinzufügen und ich werde die Schatten basierend auf der box2d Physikwelt brauchen. –

+0

Nicht versuchen, die Idee des Shaders zu erzwingen, aber Schatten können auch mit Shadern erreicht werden, sogar eine Menge könnte sein. – abhimanyud3dx

+0

Sie sagen also, dass es einfacher ist, eine "Kopie" der box2d Lichter (mit den Farben, Größen, Typen, Schatten, Umgebungslicht und Mischoptionen) mit handgeschriebenen Shadern zu implementieren, anstatt eine Lösung des Problems zu finden ?!?!?!?! –

0

Wie ich bin nicht wirklich sicher, was Sie versuchen zu erreichen, um nur einige Präzisierungen:

  • Jedes Mal, wenn Sie die box2dlights rayhandler ziehen, in der Tat Sie ein schwarzes Quadrat ziehen über das, was Sie vorher gezeichnet haben . Dieses schwarze Quadrat ist in bestimmten Regionen transparent (das sind die "Lichter").
  • Wenn Sie also mehrere Lichtschichten zeichnen, verdunkeln die oberen Schichten die darunter liegenden Schichten.
  • Box2dlights verwendet OpenGl Shader, um dieses schwarze Quadrat über Ihrer Szene zu mixen. Sie können hier auch wegen dieses
  • verwendet werden, um Ihre eigene Shadern implementieren, die nützlichste Ansatz hier ist nur eine Lichtschicht zu verwenden, die vor allem „Spiel“ Schauspieler gezogen wird, aber unterhalb der Benutzeroberfläche
+1

Ok, aber wie kann er die Lichtschicht nach einem bestimmten Akteur zeichnen und bevor die Stage draw() -Methode beendet ist, weil er für die Lichter nach dem Canvas-Actor gerendert werden muss, aber vor den Overlay-Panels? –

+0

Wie Sie bereits erwähnt haben, können Sie hier zwei Stufen verwenden. Wenn Sie nur eine Lichtschicht haben, sollte dies nicht zu komplex sein. Ansonsten muss man die Darsteller einzeln zeichnen. – Sebastian

+0

Wie ich bereits erwähnt habe, ist meine Struktur viel komplexer, so dass ich keine 2 Stufen verwenden kann ... Wenn ich meine Darsteller einzeln zeichne, werde ich die stage.draw() -Methode überschreiben wird der Unterschied sein? –

1

Ihr Problem liegt vermutlich daran, dass Ihr AfterDrawListener einmal pro Kind eines bestimmten Schauspielers aufgerufen wird (ich nehme an, dass Sie das modifizierte scene2d von The Sixth Hammer verwenden). Versuchen Sie trotzdem, zu überprüfen, ob das Ereignis nach dem Zeichnen vom selben Objekt stammt.