Hi,
Ich rendere momentan ohne Tiefenpufferung. Da fangen die Near und Far Clipping Plane an, zu stören. Wie sähe eine Transformationsmatrix aus, die sich verhält, als sei die Near Clipping Plane auf 0 (ohne weiteres möglich) und die Far Clipping Plane auf +Unendlich (nicht so einfach) gesetzt? Ich habe vor Jahren mal im Zusammenhang mit Stencil Shadows gehört, dass es sowas geben soll.
Gruß, Ky
(gelöst) Unendliche Projektionsmatrix
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
(gelöst) Unendliche Projektionsmatrix
Zuletzt geändert von Krishty am 25.05.2011, 18:59, insgesamt 1-mal geändert.
-
- Establishment
- Beiträge: 488
- Registriert: 01.03.2009, 19:09
Re: Unendliche Projektionsmatrix
So ich versuchs mal:
D3D verwendet imho diese form
w 0 0 0
0 h 0 0
0 0 Q1 1
0 0 Q2 0
mit
w = cot(fov_width/2)
h = cot(fov_heigth/2)
Q1 = FarZ/(FarZ-NearZ)
Q2 = -NearZ*FarZ/(FarZ-NearZ);
Wenn man jezt für FarZ = Infinity und für NearZ = 0 setzet erhält man folgendes:
Q1 = Inf/(Inf-0) -> ergibt 1
Q2 = -(0*Inf)/(Inf-0) -> ergibt 0
Damit sollte die Matrix also wie folgt aussehen:
w 0 0 0
0 h 0 0
0 0 1 1
0 0 0 0
Das ganze ohne Gewähr da ich es nicht Ausprobieren kann, aber ich hoff mal ich hab nicht irgendwo einen Denkfehler
Gruß
Matthias
D3D verwendet imho diese form
w 0 0 0
0 h 0 0
0 0 Q1 1
0 0 Q2 0
mit
w = cot(fov_width/2)
h = cot(fov_heigth/2)
Q1 = FarZ/(FarZ-NearZ)
Q2 = -NearZ*FarZ/(FarZ-NearZ);
Wenn man jezt für FarZ = Infinity und für NearZ = 0 setzet erhält man folgendes:
Q1 = Inf/(Inf-0) -> ergibt 1
Q2 = -(0*Inf)/(Inf-0) -> ergibt 0
Damit sollte die Matrix also wie folgt aussehen:
w 0 0 0
0 h 0 0
0 0 1 1
0 0 0 0
Das ganze ohne Gewähr da ich es nicht Ausprobieren kann, aber ich hoff mal ich hab nicht irgendwo einen Denkfehler
Gruß
Matthias
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Unendliche Projektionsmatrix
You, Sir, are completely right.
Passt, wackelt und hat Luft. Ich bedanke mich!
Passt, wackelt und hat Luft. Ich bedanke mich!
- Herror
- Beiträge: 97
- Registriert: 24.12.2009, 23:13
- Benutzertext: Ewiger Anfänger....
- Alter Benutzername: Herror
- Echter Name: Artur Schütz
- Kontaktdaten:
Re: (gelöst) Unendliche Projektionsmatrix
hey,
wollte dazu noch was fragen.
Habe versucht diese Unendliche Projektion umzusetzen und dazu habe ich die DirectX Mathefunktionen verwenden und die Matrix hinterher mit der Hand bearbeitet.
Das sieht dann so aus:
Nun habe ich das problem, wenn ich _43 sehr klein wähle (-0.0000001f), dann gibt es relativ früh Z-Fighting.
Ich mein, das ergibt auch sinn.
Wenn ich jetzt eine große Spanne darstellen will, also wenn man auf dem Mond steht und von dort aus die Erde anschaut, dann will ich sowohl die Objekte in der nähe darstellen als auch den gesamten Planeten in der Ferne.
Ich habe mir schon eine Lösung überlegt: zuerst setze ich die Planes auf (near) 10000000.0f und (far)unendlich und render alle sehr weit entfernten Objekte( Planeten, Sonne Sterne).
Dann nehme ich das erzeugte Bild und überzeichne es mit allem was zwischen (near)0.1f und (far)10000000.0f ist.
So, dass ich das Bild quasi in Vorder und Hintergrund teile um das Problem mit dem Z-Fighting zu umgehen.
Habe ich bei der Erstellung der Matrix was grob falsch gemacht oder ist dieses Teilen in 2 Ebenen die bessere Lösung?
wollte dazu noch was fragen.
Habe versucht diese Unendliche Projektion umzusetzen und dazu habe ich die DirectX Mathefunktionen verwenden und die Matrix hinterher mit der Hand bearbeitet.
Das sieht dann so aus:
Code: Alles auswählen
projection.Identity();
projection.PerspectiveFovLH(fieldOfView, screenAspect, nearDistance, farDistance);
projection._33 = 1.0f;
projection._43 = -0.1f;
Ich mein, das ergibt auch sinn.
Wenn ich jetzt eine große Spanne darstellen will, also wenn man auf dem Mond steht und von dort aus die Erde anschaut, dann will ich sowohl die Objekte in der nähe darstellen als auch den gesamten Planeten in der Ferne.
Ich habe mir schon eine Lösung überlegt: zuerst setze ich die Planes auf (near) 10000000.0f und (far)unendlich und render alle sehr weit entfernten Objekte( Planeten, Sonne Sterne).
Dann nehme ich das erzeugte Bild und überzeichne es mit allem was zwischen (near)0.1f und (far)10000000.0f ist.
So, dass ich das Bild quasi in Vorder und Hintergrund teile um das Problem mit dem Z-Fighting zu umgehen.
Habe ich bei der Erstellung der Matrix was grob falsch gemacht oder ist dieses Teilen in 2 Ebenen die bessere Lösung?
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: (gelöst) Unendliche Projektionsmatrix
Das ist so völlig legitim – eine unendliche Matrix macht Tiefenpufferung sofort unbrauchbar (darum war das auch der erste Satz im Thread).
Du kannst also vielleicht noch ein Bisschen was sparen, indem du im ersten Durchlauf die Tiefenpufferung komplett ausschaltest und erst für die endliche Matrix wieder aktivierst.
Du kannst also vielleicht noch ein Bisschen was sparen, indem du im ersten Durchlauf die Tiefenpufferung komplett ausschaltest und erst für die endliche Matrix wieder aktivierst.
- Herror
- Beiträge: 97
- Registriert: 24.12.2009, 23:13
- Benutzertext: Ewiger Anfänger....
- Alter Benutzername: Herror
- Echter Name: Artur Schütz
- Kontaktdaten:
Re: (gelöst) Unendliche Projektionsmatrix
vielen Dank für den tipp,
dann werde ich das mal genau so machen ^^
dann werde ich das mal genau so machen ^^
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: (gelöst) Unendliche Projektionsmatrix
Naja, deine Near Plane liegt dann zwar nicht bei 0, aber deine Projektionsmatrix für die Ferne ist immer noch unendlich. Das geht auch, weil \($\frac{z}{w} = \frac{w - n}{w}$\) für \($w \to \infty$\) (\($w = z_{viewspace}$\)) gegen 1 konvergiert, also liegt alles von deiner Near Plane bis Unendlich im Frustum und hat unterschiedliche Tiefenwerte. Nur wird die Tiefenpufferung in Abhängigkeit von der Near Plane bei unendlichen Projektionsmatrizen eben ziemlich ungenau. In der Praxis ist also das einfache Abschalten des Tiefenpuffers trotzdem die sinnvollste Lösung.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite