Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.02.2010, 10:40

Near/Far Plane beim Shadow Mapping

Hi,

nur mal Kontrolle, ob ich das richtig sehe: Werden diese beiden Planes ähnlich wie beim Clipping eingesetzt? Also dass Objekte direkt hinter der Near Plane den kleinstmöglichen Tiefenwert bekommen und Objekte kurz vor der Far Plane den größtmöglichen?

Ich hab irgendwo gelesen, dass man sich das wie eine würfelförmige Bounding-Box im Ursprung des Weltkoordinatensystems vorstellen soll, aber wenn ich mich recht entsinne ist bei OpenGL doch immer die Kamera im Ursprung und die Szene wird entsprechend außenrum gedreht.

Dann wären Near- und Far-Plane aber nicht mehr orthogonal zur Blickrichtung des Lichtes oder täusche ich mich da?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

22.02.2010, 12:03

Re: Near/Far Plane beim Shadow Mapping

Zitat von »"Sk!p"«


nur mal Kontrolle, ob ich das richtig sehe: Werden diese beiden Planes ähnlich wie beim Clipping eingesetzt? Also dass Objekte direkt hinter der Near Plane den kleinstmöglichen Tiefenwert bekommen und Objekte kurz vor der Far Plane den größtmöglichen?


Ja.

Zitat von »"Sk!p"«


Ich hab irgendwo gelesen, dass man sich das wie eine würfelförmige Bounding-Box im Ursprung des Weltkoordinatensystems vorstellen soll, aber wenn ich mich recht entsinne ist bei OpenGL doch immer die Kamera im Ursprung und die Szene wird entsprechend außenrum gedreht.


Wieso hängen sich alle an irgendwecheln "Ursprüngen" auf? Es gibt keinen allgemeinen Ursprung im Vektorraum.

Im allg. referenziert Near-, Farplane zu zwei Ebenen des "Viewfrustum". Das geometrisch als Pyramidenstumpf vorgestellt werden kann. Die Nearplane ist damit die Ebenene die Orthogonal zur Blickrichtung liegt und dem Betrachter am nächsten ist, die Farplane entsprechend die am weitest entfernte Ebene.

Zitat von »"Sk!p"«


Dann wären Near- und Far-Plane aber nicht mehr orthogonal zur Blickrichtung des Lichtes oder täusche ich mich da?


Doch. Um was für ein Verfahren handelt es sich denn?

3

22.02.2010, 14:45

Zitat

Wieso hängen sich alle an irgendwecheln "Ursprüngen" auf? Es gibt keinen allgemeinen Ursprung im Vektorraum.


Ich bin jetzt von (0, 0, 0) ausgegangen. Das sieht doch, soweit ich weiß, auch OpenGL als Ursprung an, oder zumindest als den Punkt, wo die Kamera immer positioniert ist.

Zitat

Im allg. referenziert Near-, Farplane zu zwei Ebenen des "Viewfrustum". Das geometrisch als Pyramidenstumpf vorgestellt werden kann. Die Nearplane ist damit die Ebenene die Orthogonal zur Blickrichtung liegt und dem Betrachter am nächsten ist, die Farplane entsprechend die am weitest entfernte Ebene.


Um das mal zu vereinfachen: Es handelt sich um eine orthogonale Projektion, das Frustum wäre also schonmal ein Quader. Wodurch werden dann eigentlich die Clipping Planes an den Seiten bestimmt, wenn ich eine Richtungslichtquelle habe?

Zitat

Doch. Um was für ein Verfahren handelt es sich denn?


Ich versuche, irgendwie das Beispiel mit der Bounding Box im Ursprung in Einklang mit meiner Vorstellung zu bringen.
D.h. also der Würfel wird immer entlang des Richtungsvektors der Richtungslichtquelle ausgerichtet?!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

22.02.2010, 15:34

Zitat von »"Sk!p"«


Ich bin jetzt von (0, 0, 0) ausgegangen. Das sieht doch, soweit ich weiß, auch OpenGL als Ursprung an, oder zumindest als den Punkt, wo die Kamera immer positioniert ist.


Nein, auf keinen Fall! Koordinaten sind immer relativ zu einer Basis zu betrachten also wären die Koordinaten (0, 0, 0) Ursprung von jeder üblichen Basis in der Renderpipeline... Es gibt keinen universellen Ursprung!

Zitat von »"Sk!p"«


Um das mal zu vereinfachen: Es handelt sich um eine orthogonale Projektion, das Frustum wäre also schonmal ein Quader. Wodurch werden dann eigentlich die Clipping Planes an den Seiten bestimmt, wenn ich eine Richtungslichtquelle habe?


Anhand der Höhe und Breite des Projektionsfensters z.B.

Zitat von »"Sk!p"«


Ich versuche, irgendwie das Beispiel mit der Bounding Box im Ursprung in Einklang mit meiner Vorstellung zu bringen.
D.h. also der Würfel wird immer entlang des Richtungsvektors der Richtungslichtquelle ausgerichtet?!


Das beantwortet leider nicht die Frage. Wo hast du die Information denn her?

5

22.02.2010, 22:31

Zitat von »"David_pb"«

Nein, auf keinen Fall! Koordinaten sind immer relativ zu einer Basis zu betrachten also wären die Koordinaten (0, 0, 0) Ursprung von jeder üblichen Basis in der Renderpipeline... Es gibt keinen universellen Ursprung!


Nimms mir nicht übel, aber du verwirrst mich ^^

Wenn ich einfach eine leere Szene erstelle, liegt dem doch ein kartesisches 3D-Koordinatensystem (das Weltkoordinatensystem) zugrunde, das aus den 3 Einheitsbasen gebildet wird und seinen Ursprung bei (0, 0, 0) hat oder nicht?

Zitat von »"David_pb"«

Das beantwortet leider nicht die Frage. Wo hast du die Information denn her?


Ich weiß es leider nicht mehr genau. Ich hab in den letzten Tagen Unmengen an Material über Shadow-Mapping und Parallax Mapping gelesen und weiß nicht mehr, wo das genau vorkam.
Es ging aber sinngemäß nur um normales Shadow-Mapping, d.h. ich leuchte mit einer Richtungslichtquelle in eine Szene und erstelle mir daraus meine Shadow-Map.
Aber wenn man die Bounding-Box jedesmal auf den Richtungsvektor der Richtungslichtquelle ausrichtet, stimmt es ja wieder. Nur suggerierte die Erklärung irgendwie, das der Mittelpunkt der Szene auch immer bei (0, 0, 0) sein soll und das muss ja nicht immer so sein.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

22.02.2010, 23:53

Zitat von »"Sk!p"«


Nimms mir nicht übel, aber du verwirrst mich ^^

Wenn ich einfach eine leere Szene erstelle, liegt dem doch ein kartesisches 3D-Koordinatensystem (das Weltkoordinatensystem) zugrunde, das aus den 3 Einheitsbasen gebildet wird und seinen Ursprung bei (0, 0, 0) hat oder nicht?


Du siehst das alles viel zu speziell... Wieso gehst du überhaupt vom "Weltkoordinatensystem" aus? Das ist doch eigentlich _das_ Koordinatensystem in dem man sich am wenigsten "befindet". Gewöhn dir lieber einen etwas mehr abstrakten Blick auf das Ganze an; Das hilft gegen aufkommende Denkblockaden weil man aus seinem Fixen denken einfach nicht die Kurve raus bekommt...

Zitat von »"Sk!p"«


Ich weiß es leider nicht mehr genau. Ich hab in den letzten Tagen Unmengen an Material über Shadow-Mapping und Parallax Mapping gelesen und weiß nicht mehr, wo das genau vorkam.
Es ging aber sinngemäß nur um normales Shadow-Mapping, d.h. ich leuchte mit einer Richtungslichtquelle in eine Szene und erstelle mir daraus meine Shadow-Map.
Aber wenn man die Bounding-Box jedesmal auf den Richtungsvektor der Richtungslichtquelle ausrichtet, stimmt es ja wieder. Nur suggerierte die Erklärung irgendwie, das der Mittelpunkt der Szene auch immer bei (0, 0, 0) sein soll und das muss ja nicht immer so sein.


Naja, da du die Quelle nicht mehr weißt könnte es auch sein das du etwas nich richtig verstanden hast oder einfach falsch im Gedächnis behalten hast, oder? Ich weiß leider nicht genau wozu diese beschriebene Bounding-Box sein soll, allerdings kann ich mir vorstellen, dass das Viewfrustum der Lichtquelle gemeint war.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

23.02.2010, 03:14

Re: Near/Far Plane beim Shadow Mapping

Zitat von »"Sk!p"«

Ich hab irgendwo gelesen, dass man sich das wie eine würfelförmige Bounding-Box im Ursprung des Weltkoordinatensystems vorstellen soll, aber wenn ich mich recht entsinne ist bei OpenGL doch immer die Kamera im Ursprung und die Szene wird entsprechend außenrum gedreht.


OpenGL/D3D machen keine Unterscheidung zwischen einer Kamera und anderen Kameras. Genaugenommen gibt es sowas wie eine Kamera gar nicht. Üblicherweise hast du jedoch eine World, eine View und eine Projection Matrix, die jeweils eine bestimmte Transformation durchführen.

Die World Matrix transformiert Objektkoordinaten in Weltkoordinaten, beschreibt also wo und wie dein Objekt in der Welt abhängt:


(Link)


Die View Matrix transformiert die Welt so dass im resultierenden Koordinatensystem die Kamera im Ursprung sitzt und entlang der z-Achse blickt. D.h. es wird mehr oder weniger alles umgekehrt gedreht wie die Kamera in der Welt gedreht ist und genau entgegen der Kameraposition verschoben. Rauskommt dass alle Koordinaten relativ zur Kamera sind:


(Link)


Was du gelesen hast ist vermutlich dass die Projection Matrix den Sichtkegel (und alles was darin steckt) in einen Einheitswürfel transformiert, und das ist im Prinzip auch was passiert:


(Link)


Das ist aber nur die übliche, bewährte Vorgehensweise um 3D Daten auf den Bildschirm zu bringen.

Zwei sehr wesentliche Wörter im letzten Satz sind "üblich" und "Vorgehensweise". Soll heißen: Wie genau du Punkte in Einheitswürfel steckst interessiert eigentlich nicht. Die ganze Geschichte von wegen Kamera und World und View und Projection und weiß der Teufel was noch alles ist lediglich der gängige Weg um 3D Daten auf eine Bildebene abzubilden. Ein haufen Berechnungen die von Parametern abhängen unter denen sich ein Mensch was vorstellen kann.
Letztendlich interessant ist nur was da zum Schluss unten rauspurzelt: Ein Haufen Dreiecke in einem Einheitswürfel.
Und dieser Einheitswürfel entspricht in weiterer Folge deinem Bildschirm.

Denn die Grafikkarte tut am Ende nichs außer einer Sache: Den Teil der Dreiecke der sich im Einheitswürfel befindet rendern (alles was drübersteht abschnipseln).
Ihr ist es herzlich egal ob du die Koordinaten der Punkte in ihrem beschaulichen Einheitswürfel mit ausgeklügelten mathematischen Tricks so berechnet hast dass das was sie gleich zeichnen wird für einen Menschen nach etwas bestimmten aussieht (dreidimensionales Objekt), ob du ihr direkt rohe Punkte hinwirfst oder ob letzte Woche Valentinstag war. Und wenn du ihr was von Kameras, Lichtquellen oder Far-Planes erzählst wird sie dich nur verdutzt anschauen.
Die Grafikkarte weis nur eines, das dafür aber ganz bestimmt: Der Punkt (-1, 1) ist links oben, der Punkt (1, -1) rechts unten und die z-Koordinate pack ich in den z-Buffer.


Zitat von »"Sk!p"«

Werden diese beiden Planes ähnlich wie beim Clipping eingesetzt? Also dass Objekte direkt hinter der Near Plane den kleinstmöglichen Tiefenwert bekommen und Objekte kurz vor der Far Plane den größtmöglichen?

Zitat von »"Sk!p"«

Dann wären Near- und Far-Plane aber nicht mehr orthogonal zur Blickrichtung des Lichtes oder täusche ich mich da?


Die Near- und Far-Plane sind nix andres als jene Tiefenwerte im Viewspace die auf die Werte 0 bzw. 1 im z-Buffer abgebildet werden. Die stehen damit per Definition "orthgonal zu Blickrichtung". Du tust ja doch nichts andres als die ganze Szene aus Sicht der Lichtquelle zu rendern. Damit ist die Lichtquelle dann deine "Kamera" und die Near- und Far-Plane sind natürlich Tiefenwerte bezogen auf die Lichtquelle...

8

25.02.2010, 15:02

Zitat von »"David_pb"«

Du siehst das alles viel zu speziell... Wieso gehst du überhaupt vom "Weltkoordinatensystem" aus? Das ist doch eigentlich _das_ Koordinatensystem in dem man sich am wenigsten "befindet". Gewöhn dir lieber einen etwas mehr abstrakten Blick auf das Ganze an; Das hilft gegen aufkommende Denkblockaden weil man aus seinem Fixen denken einfach nicht die Kurve raus bekommt...


Ich will eigentlich nur verstehen, was da vor sich geht. Wie ist mir eigentlich egal :D

Und momentan gehe ich von einem Shadow-Mapping-Algorithmus aus der so funktioniert:

1) Szene aus der Sicht des Lichts zeichnen. Near- und Far-Plane bilden dabei auf 0.0 bzw. 1.0 ab, wie von dot schön beschrieben. Wenn diesen Renderschritt aber machen will, muss man ja vom Licht aus in gluLookAt irgendeine Blickrichtung angeben, und das ist in allen Algorithmen, die ich bisher gesehen habe, immer (0, 0, 0) als Zentrum der Szene gewesen. Was sind das jetzt also für Koordinaten? Doch wohl World Space?!

2) Depth Buffer in Textur speichern.

3) Szene aus Kamerasicht zeichnen. Üblicherweise schaut die auch immer auf (0, 0, 0)

4) Depthmap auf Szene projizieren und Shadow Tests durchführen.

5) Sich freuen.

Werbeanzeige