Seite 1 von 1

(gelöst) Unendliche Projektionsmatrix

Verfasst: 25.05.2011, 17:08
von Krishty
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

Re: Unendliche Projektionsmatrix

Verfasst: 25.05.2011, 18:53
von Matthias Gubisch
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

Re: Unendliche Projektionsmatrix

Verfasst: 25.05.2011, 18:59
von Krishty
You, Sir, are completely right.

Passt, wackelt und hat Luft. Ich bedanke mich!

Re: (gelöst) Unendliche Projektionsmatrix

Verfasst: 02.09.2012, 17:40
von Herror
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:

Code: Alles auswählen

projection.Identity();
projection.PerspectiveFovLH(fieldOfView, screenAspect, nearDistance, farDistance);
projection._33 = 1.0f;
projection._43 = -0.1f;
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?

Re: (gelöst) Unendliche Projektionsmatrix

Verfasst: 02.09.2012, 17:52
von Krishty
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.

Re: (gelöst) Unendliche Projektionsmatrix

Verfasst: 02.09.2012, 18:52
von Herror
vielen Dank für den tipp,
dann werde ich das mal genau so machen ^^

Re: (gelöst) Unendliche Projektionsmatrix

Verfasst: 02.09.2012, 19:29
von CodingCat
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.