PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL: Portals und Occlusion Queries


Expandable
2006-03-09, 14:31:57
Hallo allerseits,

ich brauche jetzt mal eure Hilfe. Seit Tagen schon suche ich eine Lösung für dieses Problem, hatte schon mehrere verschiedene Ansätze, die alle samt mal mehr oder weniger gut funktionierten - jedoch noch nie zufriedenstellend.

Okay, also worum geht's? Ich habe eine kleine Engine, die Portals für Sichtbarkeitstests verwendet. Welche Portals sichtbar sind, prüfe ich mit Occlusion Queries. Das funktioniert einwandfrei und ist sehr rigoros, die zu den Portals gehörenden Areas werden wirklich nur berechnet, wenn man das entsprechende Portal auf dem Bildschirm sieht.

Nun mein Problem: Wenn ich mit der Kamera durch ein Portal fliege, kommt es ja vor, dass das Portal zwischen der Near Clipping Plane des OpenGL View Frustums und meiner Camera liegt (Abstand Kamera - Near Clipping Plane ist 1.0f). Wenn man nun in einem entsprechend blöden Winkel (sprich senkrecht) auf das Portal sieht, liefert mir das Occlusion Query 0 zurück - denn das Portal wird ja komplett von OpenGL weggeclippt.

Ich brauche also eine Möglichkeit herauszufinden, ob ein Portal zwischen der Near Clipping Plane und meiner Kamera liegt. Nur - wie mache ich das? Ich dachte einfach, ich erstelle ein "rückwärtiges" View Frustum, sprich ich nehme die Left, Right, Top, Bottom Clipping Planes wie gehabt, drehe die Normale der Near Clipping Plane um und berechne eine Camera Plane, welche letztlich die Near Clipping Plane mit umgekehrter Normalen (sprich in Blickrichtung) und einem um 1 verringerten Abstand ist.

In sagen wir 99% der Fällen funktioniert das, aber manchmal habe ich immer noch einen schwarzen Schirm beim Durchfliegen eines Portals.

Andere Möglichkeit: Ich erstelle die Ebene des Portals und eine Gerade aus Kameraposition als Aufpunkt und Kamerablickrichtung als Richtungsvektor. Ich berechne den Schnittpunkt. Man könnte jetzt testen, ob das Lambda (Koeffizient vor dem Richtungsvektor der Geraden) positiv oder negativ ist und entsprechend entscheiden, ob das Portal noch vor der Kamera liegt. Das Problem ist aber: Ich weiß nicht, in welche Richtung die Normale des Portals zeigt und weiß auch nicht, wie ich das rausfinden soll. Und wenn die Normale mal in die und mal in die Richtung zeigt, dreht sich natürlich auf das Vorzeichen von Lambda um und der ganze Test ist für die Katz.

So, hoffentlich konnte ich mein Problem klarmachen. Wäre für jede Idee dankbar. Am besten wär's natürlich, wenn man das irgendwie auf über das Occlusion Query lösen könnte, aber mir fällt da einfach nichts ein.

Danke schonmal!

Coda
2006-03-09, 15:08:32
Du kannst auch einfach die "alte" Methode benützen und das Zeug auf der CPU ausrechnen. Occ-Queries sind eh nicht so performant, weil du dauernd die GPU stalst (zumindest mit der primitiven Implementierung).

Xmas
2006-03-09, 15:10:14
Das Problem ist aber: Ich weiß nicht, in welche Richtung die Normale des Portals zeigt und weiß auch nicht, wie ich das rausfinden soll.
Verstehe ich jetzt nicht. Deine Portale sind doch beidseitig, also musst du doch für jedes Portal gespeichert haben welche Szenenteile in positiver Normalenrichtung liegen und welche in negativer? Und du musst auch herausfinden können ob sich der Betrachter gerade auf der positiven oder der negativen Seite befindet.

Das einfachste was du tun kannst, ist für jedes Portal Mittelpunkt und Radius einer Hüllkugel (in dem Fall ist es ein Kreis, aber egal) zu speichern. Dann berechnest du die Distanz vom Betrachter zum Mittelpunkt minus Radius. Ist diese Distanz kleiner als die Distanz vom Betrachter zu einem der Eckpunkte auf dem ZNear-Rechteck, könnte das Portal potenziell ZNear-geclippt werden.