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

26.06.2010, 15:34

Frustum Clipping

Hallo,

so ganz erschließt sich mir die Theorie dahinter noch nicht. Ich hab mir mal einen Ausschnitt aus dem Orange Book:

Zitat

Frustum Clipping is the process of eliminating any graphics primitives that lie outside an axis-aligned cube in clip space. This cube i defined such that the x, y and z-components of this clip space coordinates are less than or equal to the w component for the coordinate, and greater than or equal to -w (i.e. -w <= x <= w, -w <= y <= w, -w <= z <= w). Graphics primitives (or portions thereof) that lie outside this cube are discarded.

[...]

The next step in the transformation of vertex positions is the perspective divide. This operation divides each component of the clip space coordinate by the homogeneous coordinate w. The resulting x, y and z components range from [-1,1] and the resulting w coordinate is always 1. In other words, all the visible graphics primitives are transformed into a cubic region between the point (-1,-1,-1) and the point (1,1,1). This is the normalized device coordinate space, which is an intermediate space that allows the viewing area to be properly mapped onto a viewport of arbitrary size and depth.
Was mich jetzt leicht verwirrt, ist, dass dieser Prozess in Real-Time Rendering anders erklärt wird. Dort wird erst die Projektion durchgeführt, in der das Sichtvolumen in den Einheitswürfel transformiert wird, anschließend geclipped und dann eben das Screen Mapping.

Was ich dabei nicht verstehe: Warum muss das in den Einheitswürfel transformiert werden? Reicht es nicht aus, wenn ich meine Kamera und die gesamte Szene im Camera Space hab? Durch die Transformation muss ich ja dann auch irgendwie meine Objekte deformieren. Man stelle sich vor, ich gucke perspektivisch auf einen Würfel. Wenn das Sichtvolumen (das ein abgeschnittener Pyramidenstumpf ist) in den Einheitswürfel transformiert wird, dann verändert sich dabei doch auch die Geometrie des Würfels und aus der perspektivischen würde wieder eine Orthogonalprojektion werden?!

Punkt 2 ist die w-Koordinate. Wieso ist garantiert, dass die Vertizes nach der Division durch w in [-1,1] liegen? Offensichtlich ist das doch nur die Homogenisierung von 4x4 Vektoren?!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

26.06.2010, 16:17

Was mich jetzt leicht verwirrt, ist, dass dieser Prozess in Real-Time Rendering anders erklärt wird. Dort wird erst die Projektion durchgeführt, in der das Sichtvolumen in den Einheitswürfel transformiert wird, anschließend geclipped und dann eben das Screen Mapping.

Ob du vor dem Homogenisieren gegen [-w, w] clippest oder oder nacher gegen [-1, 1] führt beides doch zum selben Ergebnis. Wobei das Clipping auf der Grafikkarte normalerweise vor der Division passiert, deswegen heißt es ja auch Clip Space.

Was ich dabei nicht verstehe: Warum muss das in den Einheitswürfel transformiert werden? Reicht es nicht aus, wenn ich meine Kamera und die gesamte Szene im Camera Space hab? Durch die Transformation muss ich ja dann auch irgendwie meine Objekte deformieren. Man stelle sich vor, ich gucke perspektivisch auf einen Würfel. Wenn das Sichtvolumen (das ein abgeschnittener Pyramidenstumpf ist) in den Einheitswürfel transformiert wird, dann verändert sich dabei doch auch die Geometrie des Würfels und aus der perspektivischen würde wieder eine Orthogonalprojektion werden?!

Du musst irgendwie deine Vertices auf die Bildebene projizieren. Der Einheitswürfel ist dabei ja eigentlich das was am Ende rauskommt, nämlich die homogenisierten Gerätekoordinaten wo dein Viewport eben von [-1, 1] geht. Wenn du jetzt deine Vertices nach deiner Zentralprojektion auf die Bildebene bringst dann berechnest du eben diese [-1, 1] Koordinaten die angeben wo im Viewport deine Vertices liegen. Dies ist äquivalent mit der Vorstellung dass dein View Frustrum in einen Einheitswürfel transformiert wird. Das sind einfach zwei geometrische Interpretationen für ein und den selben Vorgang.

Der Vorteil wenn man das alles so allgemein Formuliert liegt darin dass das ganze so für alle möglichen Projektionsformen funktioniert die man mit homogenen Koordinaten darstellen kann und nicht nur für eine bestimmte...

Punkt 2 ist die w-Koordinate. Wieso ist garantiert, dass die Vertizes nach der Division durch w in [-1,1] liegen? Offensichtlich ist das doch nur die Homogenisierung von 4x4 Vektoren?!

Alles was sichtbar ist liegt in [-1, 1], der Rest wird eben geclipped...

3

26.06.2010, 18:56

ok danke, das hilft mir schonmal etwas weiter ;)

Werbeanzeige