(gelöst) Unendliche Projektionsmatrix

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(gelöst) Unendliche Projektionsmatrix

Beitrag 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
Zuletzt geändert von Krishty am 25.05.2011, 18:59, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Matthias Gubisch
Establishment
Beiträge: 488
Registriert: 01.03.2009, 19:09

Re: Unendliche Projektionsmatrix

Beitrag 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
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Unendliche Projektionsmatrix

Beitrag von Krishty »

You, Sir, are completely right.

Passt, wackelt und hat Luft. Ich bedanke mich!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
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

Beitrag 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?
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: (gelöst) Unendliche Projektionsmatrix

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
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

Beitrag von Herror »

vielen Dank für den tipp,
dann werde ich das mal genau so machen ^^
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: (gelöst) Unendliche Projektionsmatrix

Beitrag 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.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Antworten