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
Grüße
Zuletzt geändert von m.sirin am Mo Aug 30, 2010 08:50, insgesamt 1-mal geändert.
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.
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.
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.
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.
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: 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
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.
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.
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.
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 , 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:
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!!
Argh...war ja klar 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.
Mitglieder in diesem Forum: Google [Bot] und 28 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.