Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 01:19

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Einige Fragen zur Viewing Pipeline
BeitragVerfasst: So Aug 29, 2010 23:21 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Hi,
ich sehe soeben, dass ich Probleme mit der Viewing-Pipeline habe. Beim durchlaufen dieser sind einige viele Fragen zusammengekommen:

1.Geschieht die Transformation des Pyramidenstumpfes in einen Einheitswürfel automatisch durch Opengl oder muss eine entsprechende Matrix mit der Projektionsmatrix mutlipliziert werden?
1.2 Warum außer den Tiefeninformationen benötigt man noch den NDC ?

2. Wodurch kommt die perspektivische Projektion denn nun wirklich zustande?
2.1 Nachdem die Projektionsmatrix angewandt wurde? D.h. sind das die Koordinaten der Objekte, die innerhalb des Frustums sind und an die near plane bzw. Projektionsfläche projeziert werden (Gegenstände die weiter weg sind erscheinen hier auch kleiner)?
2.2 Oder kommt die Perspektive dadurch zustande, nachdem die Clipping Koordinaten in den Würfel überführt wurden? Das ist doch die Stufe des perspective divide, die automatisch von opengl angewendet wird, sobald die Vertices den Vertexshader verlassen (Primitive Assembly)?

3. Was sind clipping Koordinaten und wie kann man sich die vorstellen?
3.1 Clipping am Frustum geschieht ebenfalls automatisch?


Es sind viele Fragen, die ich auch beim Lesen mehrerer Seiten nicht beantwortet bekommen habe. Ich hoffe ihr könnt mir ein paar beantworten :D

Grüße


Zuletzt geändert von m.sirin am Mo Aug 30, 2010 08:50, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 07:38 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
1.Geschieht die Transformation des Pyramidenstumpfes in einen Einheitswürfel automatisch durch Opengl oder muss eine entsprechende Matrix mit der Projektionsmatrix mutlipliziert werden?
Das macht OpenGL automatisch. Vorausgesetzt einmal, dass du gluPerspective aufgerufen hast und nicht glOrtho. Und mit Matrizen hat das ausnahmsweise mal wenig zu tun. Das wird nämlich gemacht, indem die x und y koordinate durch die z koordinate dividiert wird. Und Matrizen können nicht dividieren.

Zitat:
3.1 Clipping am Frustum geschieht ebenfalls automatisch?
Ja. Lass doch mal nur so zum Spaß irgendwas durch die NearCP durchgehen. Das wird ganz automatisch abgeschnitten ;)

ok hoffe, das hat mal zwei deiner Fragen beantwortet. Bei den übrigen hab ich entweder die Frage nicht verstanden, oder weiß auch nicht mehr. :oops:

mfg

sharkman


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 10:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
zu 1:
Ich muss sharkman etwas korrigieren. Die Transformation des Pyramidenstumpfes in den Einheitswürfel (NDC) geschieht durch die Projektionsmatrix (im Vertexshader) und anschließender Division durch die w-Koordinate (im Schritt perspective Division). sharkman sagt, dass durch die z-Koordinate geteilt wird, das ist streng genommen falsch. Allerdings sorgt die Projektionsmatrix dafür, dass die Entfernung zur Kamera in der w-Koordinate landet, es wird also schon durch die Entfernung geteilt.

zu 1.2:
Naja, das ganze ist ja so eine Art Dreisatz. Du brauchst 'Normalized Device Coordinates' (NDC) um die Viewport-Transformation anwenden zu können. Was anderes fällt mir dazu nicht ein.

zu 2.
Perspektivische Projektion ist letztlich nichts anderes als einfacher Strahlensatz. Wir teilen durch die Entfernung zur Kamera und projizieren dadurch die Geometrie auf die Ebene die den Abstand 1 von der Kamera hat. Das ist die Near-Plane. Die mit gluPerspective erzeugte Projektionsmatrix hat noch eine eingebaute Skalierung so das man den Öffnungswinkel, NearPlane, FarPlane usw. wählen kann. Letztlich läuft das aber auf diese simple Matrix hinaus:
Code:
 1  0  0  0
 0  1  0  0
 0  0  1  0
 0  0 -1  0

Wird ein Vektor (x,y,z,1) damit multipliziert, erhalten wir (x,y,z,-z). Führen wir nun die perspektivische Division aus (also durch die 4. Koordinate teilen), teilen wir letztlich durch -z....die Entfernung zu Kamera. (Man könnte auch durch z statt -z teilen, aber das ist eine Konvention die irgendwann mal jemand festgelegt hat.) Bei dieser einfachen Matrix ist dann natürlich die 3. Koordinate immer -1, was wenig hilfreich ist. gluPerspective sorgt zusätzlich dafür das der Bereich zwischen Near- und FarPlane auf -1 bis 1 abgebildet wird. Die entsprechende Matrix findest du im Wiki.

zu 2.1 und 2.2. Ich denke ich habe das oben schon ausreichend erläutert. Der "Primitive Assembly"-Schritt hat damit jedenfalls nichts zu tun. Z.B. bei einem Dreieck wird in diesem Schritt darauf gewartet, dass die Ergebnisse aller drei Vertexshader vorliegen, bevor es weiter geht.

zu 3. Clipping Koordinaten sind die Koordinaten vor der perspektivischen Division, also ein Würfel von -w bis w.

zu 3.1 Wie sharkman schon sagt, das geht automatisch und lässt sich auch nicht abschalten.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 14:26 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
das geht automatisch und lässt sich auch nicht abschalten.
FarCP lässt sich schon abschalten mit NV_depth_clamp. Dann wird alles, was hinter der FarCP ist gerendert als ob es genau darauf liegen würde. Steht zumindest so in GPUGems3.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Aug 30, 2010 15:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
FarCP lässt sich schon abschalten mit NV_depth_clamp

Ah, ok, diese Extension kannte ich noch nicht. Wieder was gelernt :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 31, 2010 21:11 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
sharkman hat geschrieben:
Zitat:
3.1 Clipping am Frustum geschieht ebenfalls automatisch?
Ja. Lass doch mal nur so zum Spaß irgendwas durch die NearCP durchgehen. Das wird ganz automatisch abgeschnitten ;)


Achso, also doch automatisch am Frustum. Ich nahm an, dass das Clipping von Opengl am Einheitswürfel geschehe, weil dort die Clipping-Operationen einfacher anzuwenden sind.


Coolcat hat geschrieben:
zu 1:
Ich muss sharkman etwas korrigieren. Die Transformation des Pyramidenstumpfes in den Einheitswürfel (NDC) geschieht durch die Projektionsmatrix (im Vertexshader) und anschließender Division durch die w-Koordinate (im Schritt perspective Division).

Dann sorgt die Projektionsmatrix dafür, dass das View-Volume in einen Würfel überführt wird. Die Teilung durch die w-Komponente sorgt dafür, dass es ein Einheitswürfel. Richtig?

Zitat:
zu 2.
Perspektivische Projektion ist letztlich nichts anderes als einfacher Strahlensatz. Wir teilen durch die Entfernung zur Kamera und projizieren dadurch die Geometrie auf die Ebene die den Abstand 1 von der Kamera hat. Das ist die Near-Plane.
...
gluPerspective sorgt zusätzlich dafür das der Bereich zwischen Near- und FarPlane auf -1 bis 1 abgebildet wird. Die entsprechende Matrix findest du im Wiki.

Wenn alles auf die near-plane projeziert wird, verschwinden doch die z-Koordinaten, wie soll das dann in einen Würfel transformiert werden?
Dann nehme ich mal an, dass die Perspektive schon durch das Frustum erzeugt wird, indem auf die mysteriöse near plane projeziert wird. Das bedeutet für mich, dass danach eine zusätzliche Verzerrung durch die Transformation in den Würfel entsteht.

Mich hat die View Plane/View Window bei Zeichnungen sowieso schon immer irritiert, da ich nicht weiß, was für eine FUnktion sie hat. Siehe Grafik:
Bild
quelle: http://www-lehre.informatik.uni-osnabrueck.de/~cg/2000/skript/Images/Figtex/perspecproj.gif


Tut mir leid wegen solch komischen/blöden Fragen, aber ich wollte mal mich und andere ein wenig verwirren..


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 31, 2010 21:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Dann sorgt die Projektionsmatrix dafür, dass das View-Volume in einen Würfel überführt wird. Die Teilung durch die w-Komponente sorgt dafür, dass es ein Einheitswürfel. Richtig?

Jup.

Zitat:
Wenn alles auf die near-plane projeziert wird, verschwinden doch die z-Koordinaten, wie soll das dann in einen Würfel transformiert werden?

Wer hat den gesagt das auf die Near-Plane projiziert wird? Schau dir einfach mal die Matrix von gluPerspective an:
Bild
Die Z-Koordinate wird so verändert damit sie nach der Division das NearPlane bei -1 liegt und das FarPlane bei 1. Rechne einfach mal nach ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 01, 2010 13:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Zitat:
Dann sorgt die Projektionsmatrix dafür, dass das View-Volume in einen Würfel überführt wird. Die Teilung durch die w-Komponente sorgt dafür, dass es ein Einheitswürfel. Richtig?

Jup.

Ähm... eine Matrix ist eine lineare transformation. Damit kann man nicht aus einem Pyramidenstumpf einen Würfel machen. Genau das macht nämlich die Division durch w. Da wo w groß ist (also hinten) werden die Koordinaten (im speziellen jetzt x und y) kleiner. deswegen sieht man dort einen größeren Bereich.

und was das mit dem Einheitswürfel angeht... Da hat dei Projektionsmatrix natürlich schon einiges zu tun. Die sorgt nämlich dafür, dass das Zeug überhaupt erst in den richtigen Bereich kommt. Das geht nämlich wieder mit einer einfachen Division nicht.

hoffe, das ist nicht zu unverständlich

Zitat:
Achso, also doch automatisch am Frustum. Ich nahm an, dass das Clipping von Opengl am Einheitswürfel geschehe, weil dort die Clipping-Operationen einfacher anzuwenden sind.
Ähm, da hab ich wohl die Frage falsch verstanden... Ich wollte sagen, dass es sich nicht einfach ausschalten lasst (außer die FarCP) Wäre auch ziemlich kontraproduktiv. Wenn die NearCP deaktiviert wäre, kanns schon mal passieren, dass du dinge siehst, die eigentlich hinter dir sind. Und die Seitlichen, naja, dann müsste irgendwie außerhalb von deinem Framebuffer gezeichnet werden. Auch nicht ganz sinnvoll ;) Ob der das am Einheitswürfel Clippt, weiß ich ehrlich gesagt nicht, aber ich vermute es mal.

mfg

sharkman


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 01, 2010 14:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
sharkman hat geschrieben:
Ähm... eine Matrix ist eine lineare transformation. Damit kann man nicht aus einem Pyramidenstumpf einen Würfel machen
Warum denn nicht? Es gibt doch auch Scherungsmatrizen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 01, 2010 14:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Warum denn nicht? Es gibt doch auch Scherungsmatrizen.

Richtig, das geht, weil die Größe des Würfels, nämlich w, variabel ist. Wenn du den Einheitswürfel (also nach der Division) nimmst und wieder mit w multiplizierst erhältst du ja genau diesen w-Würfel.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Sep 01, 2010 16:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Es gibt doch auch Scherungsmatrizen.
die machen dann aber aus einem Würfel ein paralellogramm (bzw hald das 3d Zeugs. Fallt mir grad nicht ein, wie das heißt), oder umgekehrt, aber keinen Pyramidenstumpf. Das geht zwar grundsätzlich auch, aber erst ab 5 dimensionalen matrizen. Außerdem macht die Projektionsmatrix da oben zumindest in xy nix anderes als skalieren.

[edit] hast recht, es geht vielleicht auch mit 4x4 matrizen. Aber nicht mit der Matrix da oben. die skaliert x und y mit einer konstanten (hat primär mal was mit Öffnungswinkel zu tun, wenn mich nicht alles täuscht), addiert ein Stück w auf z und schreibt -z in w. Aber das sind alles keine sachen, die aus einem Pyramidenstumpf einen Würfel machen [/edit]

[edit2] hab nochmal überlegt, und bin mir nicht mehr so sicher, dass das überhaupt mit irgendwelchen Matrizen geht. Nach einer linearen Transformation bleiben Geraden immer Geraden. Soweit stimmts noch überein. Wenn ich jetzt die Geraden in dem Pyramidenstumpf verlängere, treffen sich vier in einem Punkt, beim Würfel nicht (oder erst irgendwo bei unendlich, jedenfalls sind sie paralell) um aus der Pyramide jetzt einen Quader zu machen, müsste ich aus diesem einen Punkt eine ganze Ebene machen (also unendlich viele Punkte (*1)) Eine Matrix kann zwar unendlich viele Punkte auf einen abbilden, aber sicher nicht umgekehrt

(*1): jedenfalls wenn alles linear bleiben soll, weil dann kann der Punkt nicht irgendwo nach unendlich gehen, wo sich die Geraden vielleicht auch bein Würfel treffen[/edit2]

Zitat:
Wenn du den Einheitswürfel (also nach der Division) nimmst und wieder mit w multiplizierst erhältst du ja genau diesen w-Würfel.
w ist doch nach der Projektion die Tiefe. die ist wie du richtig gesagt hast im Würfel nicht überall gleich. Wenn ich also jeden Punkt im Würfel mit der dazugehörenden w koordinate multipliziere, erhalte ich einen Pyramidenstumpf, und keinen Würfel.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Sep 12, 2010 22:21 
Offline
DGL Member

Registriert: Fr Jul 16, 2010 18:28
Beiträge: 40
Zitat:
m.sirin hat geschrieben:
Wenn alles auf die near-plane projeziert wird, verschwinden doch die z-Koordinaten, wie soll das dann in einen Würfel transformiert werden?

Coolcat hat geschrieben:
Wer hat den gesagt das auf die Near-Plane projiziert wird?

Du warst das :D, guck mal :
Coolcat hat geschrieben:
Perspektivische Projektion ist letztlich nichts anderes als einfacher Strahlensatz. Wir teilen durch die Entfernung zur Kamera und projizieren dadurch die Geometrie auf die Ebene die den Abstand 1 von der Kamera hat. Das ist die Near-Plane.


----------

Mal eine andere Frage, die wohl auch zum Ganzen Thema hier gehört. Es darum, herauszufinden, wie weit ich ein Objekt/eine Szene Richtung z-Achse verschieben muss, um es komplett zu sehen, d.h. die Ausdehnung der kompletten Szene auf den Anzeigebereich des Bildschirm zu bekommen.
Dazu mal eine kleine Zeichnung, wie ich das bisher gemacht habe:

Bild

Mein Augenpunkt ist, weil ich keine zusätzlichen View-Transformationen angebe im Ursprung des Weltkoordinatensystems und blickt in Richtung negativer z-Achse. Alpha, also das FOV ist derzeit mit 45° angegeben. Nun ermittle ich die größte Ausdehnung der GEsamtszene (entweder dessen Höhe oder Breite) und berechne anhand dieses Wertes den benötigten z-Wert, um den ich die Szene verschieben muss.
So sieht die Berechnung dazu aus
Code:
z-Wert=Szenenausdehnung/(tan(a/2)*2)


Diese veschobene Szene befindet sich dann innerhalb des Frustums und wird dann in späteren Schritten zum Würfel, danach (durch Viewport-Transformationen) auf den Bildschirm gebracht.

Obwohl das klappt stelle ich hier die Frage, ob zum einen meine Erklärungen und zum anderen meine Berechnungen sinnvoll oder einfach nur Müll sind (es kann ja auch Zufall sein, dass es bisher klappt) ? Ist denn wenigstens die Zeichnung korrekt?


Danke für eure Hilfen, es ist sehr kompetent hier!!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Sep 13, 2010 08:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Du warst das :D, guck mal :

Argh...war ja klar :lol:
Also wir projizieren schon irgendwie auf die NearPlane, aber eigentlich nicht, oder so ;) Wenn man nur XY betrachtet, projizieren wird auf die NearPlane, aber es gibt ja noch die Z-Koordinate.

Zitat:
Obwohl das klappt stelle ich hier die Frage, ob zum einen meine Erklärungen und zum anderen meine Berechnungen sinnvoll oder einfach nur Müll sind (es kann ja auch Zufall sein, dass es bisher klappt) ? Ist denn wenigstens die Zeichnung korrekt?

Sieht richtig aus, du musst nur noch ggf. das Seitenverhältnis des Viewports berücksichtigen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]